C++ 无法实例化抽象类,因为成员是抽象的
我有一个抽象基类ODESolver:C++ 无法实例化抽象类,因为成员是抽象的,c++,C++,我有一个抽象基类ODESolver: //ODESolver.h #ifndef ODESolver_H #define ODESolver_H #include "doublependulum.h" class ODESolver { public: ODESolver( DoublePendulum&); //constr virtual ~ODESolver(); //destr virtual void
//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(){}
我还有一个Odeuler wich从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 ¶m)
: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
}
//odeuler.cpp
#包括“ODEEuler.h”
#包括
使用namespace::std;
ODEEuler::ODEEuler(双摆和参数)
:ODESolver(参数)
{}
//析构函数
ODEEuler::~ODEEuler(){}
预测(常数双&dt=0.01)
{
DoublePend=DoublePend+DoublePend.导数()*dt;
由于以下成员而无法执行:1>无效
ODESolver::predict(const double&)':是抽象的1>
..…\odesolver.h(11):参见“odesolver::predict”的声明
我检查了我在虚拟void predict函数中使用的所有类型是否与其他函数相同。我想这可能是我在概念上犯了错误。因为“predict”是抽象的,所以我不能实例化到底意味着什么
提前感谢您的支持!您的派生类需要实现纯虚拟函数才能实例化
virtual void predict (const double &)=0;
^
void ODEEuler::Predict(const double &dt=0.01)
^
请注意大写的p
使派生类中的方法成为不同的方法,并且您最终从未定义基类纯虚方法。您的派生类需要实现纯虚函数才能实例化
virtual void predict (const double &)=0;
^
void ODEEuler::Predict(const double &dt=0.01)
^
请注意大写字母p
使派生类中的方法成为不同的方法,并且您最终永远不会定义基类纯虚拟方法。对于C++11,可以使用override关键字使编译器在许多情况下检测到此类情况。@Plasmah-是的,C++11可以做到这一点,但您需要帮助OP找出错误首先。哦,天哪!真愚蠢。我现在几乎要自杀了。非常感谢!有了C++11,人们可以使用override关键字让编译器在很多情况下检测到这样的事情。@Plasmah-是的,C++11可以做到这一点,但你需要先帮助OP找出错误。哦,天哪!真愚蠢。我现在几乎要自杀了。。是的哦,非常感谢!