2

誰かがこれについて何かアイデアを持っているかどうか興味があります。GameObjectのツリーを実装するゲームエンジンに取り組んでいます。さまざまな特定のゲームオブジェクトがそのタイプ(BouncingBall、StatScreenなど)から継承します。

class GameObject {
    public:
    vector<Component *> Components;
    vector<GameObject *> Children;
    GameObject *Parent;
};

したがって、実行時に、ゲームにはこれらの巨大なツリーがあり、すべてが異なるタイプです。残念ながら、Childrenベクトル内のオブジェクトはすべて、デバッガーで「GameObject *」として報告されるため、何が何であるかを判断するのは非常に困難です。

私が思いついた最善の解決策は、構造のメンバー変数として型を格納することです。

class GameObject {
    public:
    // ...
    const char *Type;

    // Saves current class name as Type.
    template<class T>
    void StoreTypeName( T *thisPointer ) {
        this->Type = typeid( *thisPointer ).name();
    }
};

しかし、すべてのオブジェクトコンストラクターで、StoreTypeNameを呼び出すことを忘れないでください。

class FancyBlinkingObject : public GameObject {
    public:
    FancyBlinkingObject() {
        StoreTypeName( this );
    }
};

これを自動的に行うための他の可能なトリックはありますか?デバッガー側(Visual Studio 2012)またはコードのどちらか?

おそらく、ある種の中央動的キャストテスト機能について考えました。

if ( dynamic_cast<FancyBlinkingObject *>( basePointer ) ) {
    return "FancyBlinkingObject";
}
if ( dynamic_cast<UglyBlueObject *>( basePointer ) ) {
    return "UglyBlueObject";
}

しかし、ifのリストを手動で維持する必要がなければ、それを行う方法を考えることはできません。可能であれば、完全に自動化されたものが必要です。:)

4

1 に答える 1

3

David Rodriguezのコメントによると、GameObjectをポリモーフィックにする(私の場合はデストラクタを仮想化する)と、デバッガーでの分類が変更され、vptrが実行時型情報に表示されました。

于 2012-12-06T23:30:59.540 に答える