C++,帮助扩展此类

C++, help extending this class

本文关键字:扩展 帮助 C++      更新时间:2023-10-16

我要扩展一个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中一样。如何做到这一点?

只需将构造函数放入继承类构造函数的初始值设定项列表中:

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

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

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

JRB2World::JRB2World(const b2Vec2& gravity):b2World(gravity) {
}
在这个

例子中,我更喜欢组合而不是继承。

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