2011-06-18 16 views
3

ゲームでは、互いに通信するエンティティがあります。プレイヤーがアイテムと衝突し、そのアイテムがそのアイテムに配置されているとします。std::vector<Item*>ダイナミックキャストはここで適切ですか?

プレーヤーが衝突メッセージを受信すると、アイテムをエンティティ*として受け取ります。プレイヤーがそれをアイテムとしてキャストし、キャストが成功した場合はアイテムをインベントリにプッシュするのが適切でしょうか?

ゲームは彼にHIT_ITEMメッセージを送信した場合でも、彼はまだそれをプッシュし、それをキャストする必要があります。

おかげ

答えて

2

dynamic_castダウンキャストの実行中に有効性を確認するのに役立ちます。

NULLを返します。ポインタまたは参照を安全にダウンキャストできない場合は、例外(std::bad_cast参照)がスローされます。

あなたが私たちにクラス構造を見せなければ、それは言うまでもありません。

2

をあなたは満足そう、その後、自分のためにこれらの質問に答えることができます。

  • なぜ、アイテム*ではなくエンティティ*で衝突メッセージを受け取るのですか?
  • 潜在的なキャストの時点で、ダイナミックなタイプのアイテムになることは確かですか?そうでない場合はどうなりますか?
  • キャストを避けるためにコードを比較的簡単に再設計する方法はありますか?

とにかく、独り占めしないでください。現在の状況でダウンキャストが他のものよりも便利な場合は、それを行う。 IMHO

+0

キャストなしでこれを行うことができる再設計の例を教えてください。私のMessageクラスにはEntity *があります。そのため、すべてがこのように送信されます。私のMessageクラスにゲームのすべてのEntityタイプへのポインタが含まれていますか? – jmasterx

+0

@Milo:そうしてはいけません。私はあなたの内部を知らない。これらの目的に役立つ数多くのパターンがあります。それぞれ独自のケースに該当します...しかし、一般的な目的のメッセージに関する限り、通常はダウンキャストがあります –

+1

@Milo:訪問者との二重ディスパッチアイテムをプレーヤーの在庫に追加するためのものです。 "二重発送"を検索すると、十分な例が得られます。 – Xeo

-1

GetType()関数と共に型メンバーを基本クラスに追加する方法はありますか?これは私が通常それらの "キャスト"問題を解決する方法です。

さらに、dynamic_castを使用する場合はRTTIをオンにすることを忘れないでください(無視してください)。

+0

型を知っていても、Entity *をItemのベクトルに押し込むことはできません。*できますか? – jmasterx

+0

@Milo: 'Entity'と' Item'の関係はどうですか? – quamrana

+0

'Entity'メッセージが' GetType'関数を使って 'Item'であることが分かっていても、それをキャストする必要があります。しかし、それを' static_cast'することができます。 – Node

0

あなたは自分自身に質問しなければならない主な質問は、これをEntityで仮想関数にすることができますか?この場合、私はおそらく「いいえ」と言うでしょう。なぜなら、非アイテムがあなたがアイテムで何をするのかを知っているか気にしていないからです。したがってdynamic_castはおそらく適切な解決策です。nullのケースを安全に処理でき、他の派生クラスはItemについて何も知る必要がなくなります。

関連する問題