0

私のC++プログラムには次のクラスがあります。

  • game_entity
  • game_entityから継承するgame_creature

game_entity、game_creature、またはその他の下位クラスから継承するクラスをさらに増やす予定です。

また、game_entityインスタンスとgame_creatureインスタンスの両方を含むgame_entity型の配列もあります。今私の問題はこれです:それが関数に渡されるときに配列をループしようとしますが、それがgame_creatureオブジェクトに到達するとき、それは添え字形式を使用してポインターを十分にインクリメントしません。

例えば:

最初のオブジェクトがgame_creature(game_entityよりも多くのフィールドを持つ)の場合、最初の3つのフィールド(game_creatureでもgame_entityと同じ)に問題なくarray[1]アクセスできますが、アクセスすると、の値にアクセスします。 2番目のgame_creatureオブジェクトの最初の2つのintとして、最初のgame_creatureの2番目の2つのint。

これは、x = 1、y = 2、sprite * = Something、movespeed = 5、health = 25のgame_creatureがある場合、2番目のgame_creatureオブジェクトのxとyに5と25としてアクセスすることを意味します。実際には、最初のgame_creatureのmovespeedとhealthです。

これは、「game_entity」のxとyに対してポインタが指しているメモリが、実際には「game_creature」の移動速度と正常性がある場所にあるためだと思います。ただし、game_entitiesの配列を作成する方法がわからないため、ゲームのグリッド上にある任意のタイプのオブジェクトを保持できますが、適切なフィールドにアクセスし、毎回ポインターを十分にインクリメントします。

どんな助けでも大歓迎です。

4

3 に答える 3

4

基本クラスへのポインターの配列を作成できます。これはエンティティを「保持」しますが、基本クラスの配列を作成して、サブクラスも保持すると想定することはできません。 C/C++、配列は固定長で、各要素は固定量です。ベクトルなどを使用したとしても、各要素は純粋に基本クラスになるため、機能しません。

C++11 では、タプルを使用できますが、探しているものではない可能性があります。基本クラスへのポインターの配列 (または、スマート ポインターのコンテナー クラス) を使用して、それを反復処理します。

于 2012-04-12T21:18:58.997 に答える
1

異なるクラスの配列を持つことはできません。派生クラスを基本クラス配列に入れようとすると、スライスが発生します。基本クラスへのポインターの配列を使用する必要があります。

于 2012-04-12T21:17:55.417 に答える
1

ポリモーフィズムを使用し、C++ 標準サポートを使用する必要があります (仮想基本クラスを使用して、「インスタンスの」ポインターのコンテナーを反復処理します)。

于 2012-04-12T21:18:07.313 に答える