0

C++ で独自の CBGE (コンポーネント ベースのゲーム エンジン) を作成しようとしていますが、この質問に行き詰まっています: オブジェクトが特定のクラスに属しているかどうかを確認するにはどうすればよいですか? またはポインターと同等ですが、ポインターが特定のクラスのオブジェクトを指しているかどうかを確認するにはどうすればよいですか? 例を挙げましょう:

コードのどこかにこれがあります:

//ComponentManager.h
...
std::map<rUUID, std::vector<Component*>> bucket;
...

ここで、rUUID は UUID を表すクラスであり、Component はエンティティが持つことができるすべてのタイプのコンポーネントを表す抽象クラスです。

特定の rUUID の特定のタイプのコンポーネント (PositionComponent など) を取得するにはどうすればよいですか?

また、このタイプの設計が良いか悪いか、もしそうならどのように形成されるべきか教えてもらえますか?

4

3 に答える 3

1

RTTI は非常にうまく機能しますが、もう 1 つの方法を示したいと思います。

ご覧のとおり、すべてのインスタンスはコンポーネント クラスに属しています。この場合、コンポーネント内に独自の仮想メソッドを作成して、独自に使用できます。このような:

class Component
{
    virtual std::string
    type() const = 0;
};

class someComponent : public Component
{
    virtual std::string
    type() const { return "someComponent"; }
};

このようにして、追加の利点を得ることができます。たとえば、まったく異なるクラスに同じ型を作成します。または、型を返すだけでなく、より複雑なアクションを実行します。また、コンパイラは RTTI を備えている必要はありません。

于 2013-06-08T20:45:28.190 に答える
1

おそらく、この関数を使用できます: typeid()

于 2013-06-09T10:11:58.920 に答える
1

クラスFooにいくつかの仮想メソッドがあり、コンパイラがRTTIをサポートしている場合は、 のインスタンスを指しているかdynamic_cast<Foo*>(p) != NULLどうかを確認できます (のスーパークラスへのポインタとして宣言されていると仮定します) 。pFoopBar *p;BarFoo

注意:がのサブクラスのインスタンスを指している場合はdynamic_cast<Foo*>(p) != NULLが返されます。truepFoo

<typeinfo>ヘッダーと(別の回答でBlackMambatypeidが示唆するように)も参照してください。

于 2013-06-08T17:35:37.517 に答える