0

この質問をフォローアップすると、次のような「オプション 3」を使用するよう提案されました。

class b2Body {
private:
    b2Body() {}
    friend class b2World;
};

class Body : public b2Body {
private:
    Body() {}
    friend class World;
};

class b2World {
public:
    b2Body *CreateBody() {
        return new b2Body;
    }
};

class World : public b2World {
public:
    Body *CreateBody() {
        return new Body;
    }
};

int main() {
    World w;
    Body *b = w.CreateBody();
    return 0;
}

オンラインで試す

しかし、これには 2 つの大きな問題があります。

  1. Body(プライベートでWorld::CreateBodyあるため)であっても、構築することはできませんb2Body
  2. できたとしても、b2Bodyパーツは正しく初期化されません (呼び出すb2World::CreateBody 必要があります)。

b2Bodyこれは、 /から継承してb2World、この同じ設計パターンに従うことはできないということですか? (b2* クラスは編集できないことに注意してください)

もしそうなら、代わりにb2Worldandb2Bodyをメンバー変数として保持することをお勧めしますか?


現在、次の2つのオプションに帰着すると思います。

4

1 に答える 1

2

しかb2World作成できb2Bodyないので、これはどこにも行きません。これらのクラスは明らかに継承するように設計されていないため、代わりに集約してください。の線に沿った何かはどうですか

class Body {
public:
    Body( b2Body* b ) : b2b( b ) {}

private:
    b2Body*const b2b;
};

class World {
public:
    World() : b2w( /* create b2w here */ ) {}

    Body *CreateBody() {
            return new Body( b2w->CreateBody( /*...*/ ); }
    }
private:
    b2World*const b2w;
};
于 2009-10-16T18:46:04.150 に答える