1

我有这个抽象基类 ODESolver:

//ODESolver.h
#ifndef ODESolver_H
#define ODESolver_H
#include "doublependulum.h"
class ODESolver
{
public:
    ODESolver( DoublePendulum&);           //constr
    virtual ~ODESolver();                  //destr
    virtual void predict (const double &)=0; //virtual
protected:
    DoublePendulum DoublePend;
};
#endif

实施:

//ODESolver.cpp
#include "ODESolver.h"
//constructor
ODESolver::ODESolver( DoublePendulum & param)
          :DoublePend(param)
{}
//destructor
ODESolver::~ODESolver(){}

我也有这个类 ODEEuler ,它继承自 ODESolver

//ODEEuler.h
#ifndef ODEEuler_H
#define ODEEuler_H
#include "ODESolver.h"
class ODEEuler : public ODESolver
{
public:
    ODEEuler(DoublePendulum &);
    virtual ~ODEEuler();     
    virtual void Predict(const double &);
};
#endif

实施

//ODEEuler.cpp
#include "ODEEuler.h"
#include <iostream>
using namespace::std;
ODEEuler::ODEEuler (DoublePendulum &param) 
         :ODESolver(param)
{}
//destructor
ODEEuler::~ODEEuler(){}
 void ODEEuler::Predict(const double &dt=0.01)
{
    DoublePend=DoublePend+DoublePend.Derivative()*dt;
    cout << DoublePend.getUp().getTheta() << endl; \\ I want to print getTheta on the screen form my getUp Pendulum from my Doublepend
}

我现在想测试我的 ODEEuler,所以我在主文件中创建了一个对象:

//Main.cpp
#include "pendulum.h"
#include "doublependulum.h"
#include "ODEEuler.h"
#include "ODESolver.h"
#include <iostream>
using namespace::std;
int main()
{ 
Pendulum MyPendulum(1.5,1.5,1.5,1.5);
DoublePendulum MyDoublePendulum(MyPendulum,MyPendulum,9.81);  
ODEEuler myODEEuler(MyDoublePendulum);
return 0;
}

我不断收到此错误:

1>....\main.cpp(24): 错误 C2259: 'ODEEuler' : 无法实例化抽象类 1> 由于以下成员: 1> 'void ODESolver::predict(const double &)' : 是抽象类 1 >
.....\odesolver.h(11) : 参见 'ODESolver::predict' 的声明

我检查了我在虚拟 void 预测函数中使用的所有类型是否与其他地方相同。我想这可能是我做错了一些概念性的事情。因为“预测”是抽象的,所以我不能实例化到底是什么意思?

提前感谢您的支持!

4

1 回答 1

4

您的派生类需要实现纯虚函数才能被实例化。

virtual void predict (const double &)=0;
             ^

void ODEEuler::Predict(const double &dt=0.01)
               ^

请注意它使派生类中的方法成为不同方法的资本p,您最终永远不会定义基类纯虚拟方法。

于 2012-05-10T10:47:24.073 回答