2

Component親クラスであるクラスがあり、たとえばクラスがありSpriteます。Spriteアニメーションの子供もたくさんいますが、それはこの質問の焦点では​​ありません。を保持するコンポーネントマネージャーもありますmap<string, Component>。作成したすべてのコンポーネントをこのマップに保存します。現在12種類のコンポーネントがありますが、それは増えるでしょう。

Componentのクラスにはvirtual void draw()update()関数があり、Spriteこの場合も同じです。ただし、コンポーネントのマップをループすると、とだけが呼び出さComponent draw()update()ます。

私はまだ実際に私のために働いている答えを見つけることができませんでした。

4

3 に答える 3

1

オブジェクトのスライスが発生しています。オブジェクトはmapでのみ保存されるため、これらのオブジェクトには、サブクラスによって提供される情報は含まれていません。一般的に、サブタイプのポリモーフィズムは、値型ではなく、ポインター型を介してのみ機能します。したがって、インスタンスをポインタで格納する必要があります。できれば:ComponentComponentstd::map<std::string, std::unique_ptr<Component>>

components["example"] = std::unique_ptr<Component>(new Example());

C ++ 11以外のコンパイラを使用している場合は、次を使用してくださいstd::map<std::string, Component*>

components["example"] = new Example();

また、コンポーネントマネージャのデストラクタなど、クリーンアップ中にオブジェクトdeleteを確認してください。ComponentC ++ 03:

for (std::map<std::string, Component*>::const_iterator i = components.begin();
    i != components.end(); ++i)
    delete i->second;

C ++ 11:

for (const auto& i : components)
    delete i.second;
于 2012-07-31T20:51:13.857 に答える
1

あなたの問題は非常に一般的です、それはスライスと呼ばれています。マップには元のオブジェクトは含まれていません。オブジェクトのコピーが含まれています。コピーは、マップに挿入しようとしたタイプではなく、マップに対して宣言した基本タイプです。

これを回避する唯一の方法は、オブジェクト自体ではなくポインタを格納することです。通常、これはshared_ptr、クリーンアップが自動的に行われるようになどのスマートポインタを使用しています。

于 2012-07-31T20:52:31.917 に答える
0

私にはスライスのように聞こえます。コンポーネントへのポインタをマップに保存してみてください。

于 2012-07-31T20:44:42.180 に答える