私はC++を学んでおり、エンティティコンポーネントシステムを作成したいと思っています。そのためには、エンティティにコンポーネントを追加するときにコンポーネントのタイプを知る必要があります。 Javaでは、私はちょうどこのような何かをするでしょう:Javasクラス<?> C++で同等
Class<?> someClass = myComponent.class;
私はC + +で何かできますか?私はtypeid(myComponent)を試しましたが、このような状況では動作しません。
ExtComponent* extended = new ExtComponent();
Component* base = dynamic_cast<Component>(extended);
std::cout << typeid(base).name();
これは "class Component"を返しますが、このような状況では "class ExtComponent"を返すものが必要です。どうすればいいの?
あなたがしたいのは、 'std :: cout << typeid(* base).name()'です。 baseは 'Component *'であり、決して変更されません。基礎となる仮想タイプに基づいて、どのタイプのベースポイントがタイプを変更できるか。また、あなたのダイナミックキャストには 'dynamic_cast'が必要です。 –
アップキャストにdynamic_castは必要ありません。 'Component * base = extended;'で十分です。 – user2079303
@quipoは喜んで助けます。他に注意しなければならないことは: 'new'を使って動的オブジェクトを作成することはめったに良い考えではありません。自動変数を優先する。また、 'type_info :: name'は実装定義の文字列を返します。それは "クラスExtComponent"であるか、 "_ZN9ExtComponent"またはそれ以外のものである可能性があります。異なるコンパイラ間で文字列が同一であることや、読みやすい名前であることに頼ることはできません。 – user2079303