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(){}

ODESolverから継承するこのクラスODEEulerもあります

//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 ファイルにオブジェクトを作成しました。

//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 に答える