我要扩展一个C ++类,但绝对没有该语言的背景。谷歌搜索没有帮助我理解如何解决编译错误:
Constructor for 'JRB2World' must explicitly initialize the base class 'b2World' which does not have a default constructor
所以,有这个b2World.h
class b2World
{
public:
b2World(const b2Vec2& gravity);
~b2World();
// ...
及其.cpp:
b2World::b2World(const b2Vec2& gravity)
{
// ...
}
b2World::~b2World()
{
// ...
}
我的班级标题:
#import "Box2D.h"
class JRB2World : public b2World {
float factor;
public:
JRB2World(const b2Vec2& gravity);
~JRB2World();
float getFactor();
void setFactor(float f);
};
我的班级实施:
JRB2World::JRB2World(const b2Vec2& gravity) {
// Constructor for 'JRB2World' must explicitly initialize the base class 'b2World' which does not have a default constructor
}
JRB2World::~JRB2World() {
}
float JRB2World::getFactor(){
return factor;
}
void JRB2World::setFactor(float f){
factor = f;
}
我认为它与调用“超级构造函数”有关,就像在java或objc中一样。怎么办呢?
答案 0 :(得分:4)
只需将构造函数放入继承类'constructor:
的初始化列表中JRB2World::JRB2World(const b2Vec2& gravity) : b2World(gravity) {
}
根据你想做的事情,我不会在这里使用继承:将Box2D世界放入成员变量中。这应该可以更容易地替换它,以防万一它的接口改变版本,或者你决定稍后使用另一个物理引擎。
答案 1 :(得分:1)
您的基类没有默认(不带参数)构造函数。在派生类初始化列表中调用它:
JRB2World::JRB2World(const b2Vec2& gravity):b2World(gravity) {
}
答案 2 :(得分:1)
对于这个例子,我倾向于使用继承的组合。
使用合成,您始终可以选择定义自己的行为,或者只是公开您的合成部分。这样您就不会面临继承层次结构(虚拟与非虚拟等)可能施加的限制。您可能不需要访问新类中的所有b2World方法