1

我要扩展一个 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 中的“超级构造函数”有关。如何才能做到这一点?

4

3 回答 3

4

只需将构造函数放入继承类的构造函数的初始化列表中即可:

JRB2World::JRB2World(const b2Vec2& gravity) : b2World(gravity) {
}

根据您想要做什么,我不会在这里使用继承:将 Box2D 世界放入成员变量中。这应该更容易替换它,以防万一它的接口在版本上发生变化,或者您稍后决定使用另一个物理引擎。

于 2012-11-16T11:10:20.733 回答
1

您的基类没有默认(不带参数)构造函数。在派生类初始化列表中调用它:

JRB2World::JRB2World(const b2Vec2& gravity):b2World(gravity) {

}
于 2012-11-16T11:10:02.367 回答
1

对于这个例子,我更喜欢组合而不是继承。

使用组合,您始终可以选择定义自己的行为或简单地公开您的组合部分的行为。这样您就不会遇到继承层次结构(虚拟与非虚拟等)可能施加的任何限制。您可能不需要访问新类中的所有 b2World 方法

于 2012-11-16T11:15:23.560 回答