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 に答える