2012-05-10 190 views
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): error C2259: 'ODEEuler' : cannot instantiate abstract class 1> due to following members: 1> 'void ODESolver::predict(const double &)' : is abstract 1>
.....\odesolver.h(11) : see declaration of 'ODESolver::predict'

我如果所有類型的檢查發現我用在我的虛擬無效預測函數中與其他地方相同。我想這可能是一些概念,我做錯了。究竟是什麼意思,我不能實例化,因爲'預測'是抽象的?

在此先感謝您的支持!

回答

4

您的派生類需要實現純虛函數才能實例化。

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

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

通知資本p它使派生類的方法,不同的方法,你最終會永遠定義基類純虛方法。

+1

使用C++ 11,人們可以使用override關鍵字在很多情況下使編譯器檢測到這種情況。 – PlasmaHH

+2

@ PlasmaHH - 是的C++ 11可以做到這一點,但你需要幫助OP找出錯誤。 – DumbCoder

+0

天啊!多麼愚蠢。我非常接近自殺現在.. 非常感謝! – ComputerSaysNo