C++ 在c++;班

C++ 在c++;班,c++,pointers,member,ode,odeint,C++,Pointers,Member,Ode,Odeint,我需要用odeint库求解ODE方程组。“main.cpp”文件仅用于调用计算(稍后将对其进行扩展,这里是保持代码整洁的简单版本) main.cpp #include "calc.h" int main() { calc c; c.startC(); return 0; } include <iostream> #include <boost/numeric/odeint.hpp> #include <math.h> #incl

我需要用odeint库求解ODE方程组。“main.cpp”文件仅用于调用计算(稍后将对其进行扩展,这里是保持代码整洁的简单版本)

main.cpp

#include "calc.h"

int main()
{
    calc c;
    c.startC();
    return 0;
}
include <iostream>

#include <boost/numeric/odeint.hpp>
#include <math.h>

#include "calc.h"

using namespace std;
using namespace boost::numeric::odeint;

const double g = 0.15;


void calc::solveO( const vector_type &y , vector_type &ODE , const double t )
{
    dy[0] =  y[1];
    dy[1] = -y[0] - g*y[1];
}

void calc::printR(const vector_type &y, const double t)
{
    cout << t << endl;
    cout << y[0] << endl;
}

void calc::startC()
{
    const double dt = 0.1;
    typedef runge_kutta_dopri5<vector_type> stepper_type;
    vector_type y(2);
    //Initial conditins
    y[0]=   1.0;
    y[1]=   0.0;


    //Initializing of ODE solver
    integrate_const(make_dense_output<stepper_type>( 1E-12, 1E-6 ), 
                    this->*solveO, y, 0.0, 1.0, dt , printResults); //ERROR HERE
}

int calc::main()
{
    return 0;
}
这是计算头,starC();它是公开的。
calc.h

#ifndef MAIN_H
#define MAIN_H

#include <iostream>
#include <boost/numeric/odeint.hpp>
#include <math.h>

using namespace std;
using namespace boost::numeric::odeint;

typedef std::vector< double > vector_type;

class calc
{
public:
    int main();
    void startC();
private:
    void solveODE(const vector_type &y , vector_type &ODE , const double t );
    void printR();

};

#endif // MAIN_H
此操作以“初始化ODE解算器”级别的错误结束,错误为:

在“积分常数”中调用solveO的正确方法是什么

编辑: 多亏@tobi303和@rbelli的帮助,它现在可以工作了。在这里,我发布总结,TL:DR解释:

最简单的解决方案是使solveO和printR成为自由函数并调用:

integrate_const(make_dense_output<stepper_type>( 1E-12, 1E-6 ), solveO, y, 0.0, 1.0, dt , printR);
integrate_const(使密度输出(1E-12、1E-6)、solveO、y、0.0、1.0、dt、printR);

如果
integrate\u const
接受函数指针,则无法传递成员函数指针。成员函数指针不同于函数指针,因为它们隐式地需要
这个
作为参数

由于您在
solveO
中不使用任何类成员,因此只需将其设置为自由函数即可:

void solveO( const vector_type &y , vector_type &ODE , const double t )
{
    dy[0] =  y[1];
    dy[1] = -y[0] - g*y[1];
}

您可以使用boost::bind(this,&calc::solveO,_1,_2,_3),也可以使用像这样的lambda函数(const vector_type&y,vector_type&ODE,const double t){this->solveO(y,ODE,t)}作为integrate_const accept functor。它解释了一点,但仍然没有指出正确的调用。我在C++方面经验不太丰富。我尝试了@rbelli:1建议的解决方案。boost::bind失败:
“'bind'不是'boost'的成员”
2。似乎干扰了integrate_const:
“必须使用“.*”或“->*”来调用指向成员函数的指针”
@Karls希望这听起来不会太粗鲁:无论是否有经验,您都需要rtfm。我试图查找integrate_const所使用的参数,但它是大量模板化的,因此我还必须阅读他们的手册才能知道可以传递什么。如果幸运的话,你可以通过函子或lambda。无论如何,我会远离
bind
,但这只是我个人的偏好,这不是关于错误的参数,所以你有点急躁。我知道如何执行integrate_const。看这里(最后一个答案):如果我像本例中那样对所有一个文件进行编码,它就会工作。当我使用我在OP中介绍的类时,问题就开始了。出于某些原因,我需要这种形式的类,因为它将是更大程序的一部分。你现在明白真正的问题在哪里了吗?@Karls如果不是关于参数,那是关于什么的?如果不同时传递一个实例,就不能传递成员函数指针。我不知道您可以传递给
integrate\u const
的参数是什么,否则我可以告诉您如何解决它。顺便说一句,不要试图成为爪哇人。不是所有的东西都必须在一个类中,仅仅因为类很酷……@Karls…无论如何,没有很好的理由说明您传递的函数必须是成员函数。你甚至不使用这个班的任何成员。
integrate_const(make_dense_output<stepper_type>( 1E-12, 1E-6 ), solveO, y, 0.0, 1.0, dt , printR);
void solveO( const vector_type &y , vector_type &ODE , const double t )
{
    dy[0] =  y[1];
    dy[1] = -y[0] - g*y[1];
}