7

の基底クラスgameObjectと の派生クラスが与えられたanimatedGameObject場合、それらのすべてのインスタンスをstd::vector. ベクトルGameObjectsが の基本型であると宣言されている場合gameObject*、派生オブジェクト インスタンスにはキャストが必要です。

例:

vector<gameObject*> GameObjects;

gameObject A* = new gameObject( ...init... ); 
animatedGameObject B* = new animatedGameObject( ...init... );

GameObjects.push_back(A);
GameObjects.push_back(B);

// to access the animatedGameObject functions:
static_cast<animatedGameObject*>(GameObjects[1])->functionUniqueToAnimated();

いつものように恐れて、私は Scott Meyers (Effective C++、第 3 版) に目を向けました。

多くのプログラマーは、キャストはコンパイラーに型を別の型として扱うように指示するだけだと信じていますが、これは誤りです。あらゆる種類の型変換 (キャストによる明示的またはコンパイラによる暗黙的) は、多くの場合、実行時に実行されるコードにつながります。

私は彼の項目 27: キャスティングを最小化する を 2 回読みましたが、これに慣れていないため、 「これは愚かなことですか?」という単純な質問に答えることができないことに苦労しています。

呼び出しとは何の関係もないことを行うのがばかげている理由がいくつかあることに言及する必要がありstatic_castます。質問は、重要な順に次のとおりです。

  1. 上記の例で を使用すると、考えられるリスクがいくつか見られませんstatic_castか?
  2. std::vectorそのようなアプローチよりも優れたデータ構造はありますか? (明らかな場合に限り、調査を依頼しているわけではありません。)

ここで質問するのは初めてなので、必要に応じて事前に謝罪してください。

4

2 に答える 2