C ++,帮助扩展这个类

时间:2012-11-16 11:06:30

标签: c++ inheritance

我要扩展一个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中一样。怎么办呢?

3 个答案:

答案 0 :(得分:4)

只需将构造函数放入继承类'constructor:

的初始化列表中
JRB2World::JRB2World(const b2Vec2& gravity) : b2World(gravity) {
}

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

答案 1 :(得分:1)

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

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

}

答案 2 :(得分:1)

对于这个例子,我倾向于使用继承的组合。

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