基本クラスがgameObject
で、派生クラスがanimatedGameObject
であるとすれば、すべてのインスタンスをstd::vector
に保存するとよいかもしれないと考えました。ベクトルGameObjects
が基本型gameObject*
であると宣言されている場合、派生オブジェクトインスタンスはキャストが必要です。static_castを使用して混合(ベース&派生)オブジェクトのベクトルを処理する場合のパフォーマンス上のリスクはありますか?
例:
多くのプログラマは、キャストが何もしないことを信じている:
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();
は通常通り怖いので、私は、件名に書き込みスコット・マイヤーズ(効果的なC++第3版)、になりましたあるタイプを別のタイプとして扱うようにコンパイラに指示しますが、これは間違いです。あらゆる種類の型変換(キャストによる明示的またはコンパイラによる暗黙的)は、実行時に実行されるコードにつながることがよくあります。
私は彼の項目27を介して読んだ:二回鋳造最小化、まだこれで私の経験不足を与えられ、私は簡単な質問答えるために私のできないことに苦しんでいます「これが行うことをDUMB事ですか?」
私はそれがstatic_cast
を呼び出すこととは何の関係もないことを行うにダムの事あるいくつかの理由があることを言及する必要があります。質問は、重要度順に、以下のとおりです。私は上記の私の例ではstatic_cast
を使用して、いくつかの可能性のあるリスクを見ていない
- アム?
- このようなアプローチでは、
std::vector
よりも優れたデータ構造がありますか? (明白なものがある場合のみ、私に研究を依頼しているわけではありません)
これは私の最初の質問です。
+1のために有効なC++ – Borgleader
ここで行うべきことは、 'draw()'を基本クラスの仮想関数として定義することです。あなたは単にキャストなしでそれを呼び出すことができ、それは正しいことをするでしょう。あなたはこれに気付いていますが、キャストの効果について具体的に知りたいですか? – jogojapan
'boost :: ptr_vector' – Mehrdad