装備、武器、道具の 3 つの異なるクラスがあるとします。Weapon and Tools は Equipment を継承します。Weapon または Tool オブジェクトを作成し、Equipment 配列に追加しました。オブジェクトを取得するときに、このオブジェクトが武器かツールかを確認するための "IF" ステートメントをどのように記述すればよいですか?
ありがとう
次のようにdynamic_castを使用します。
Equipment *pMyObj = ... //got it somewhere
Weapon *pWeapon = dynamic_cast<Weapon *>(pMyObj);
if( pWeapon != NULL ){
//you have weapon
}
RTTI(リンク)について話しているのですが、Equipment基本クラスに「type」列挙型を保持してから、それと照合して派生型が何であるかを確認する方がよい場合があります。次にdynamic_cast
、Equipmentオブジェクトを正しい派生タイプに変更できます。
ただし、dynamic_castについては多少複雑な感じがします。
それは機能しますが、選択肢の数が増える可能性がある場合は、最良の選択ではない可能性があります。そのような場合、私は「種類」の列挙と仮想GetKind()メソッドを好みます。これにより、列挙型で優れたswitch()ステートメントが可能になり、列挙型の値の1つをリストするのを忘れた場合でも、ほとんどのコンパイラーは警告を発することができます。
ケース:セクションで処理しているクラスがすでにわかっているので、dynamic_castを実行する必要がなくなり、同じチェックを2回実行する必要がなくなります。
もちろん、switch()またはif-else-cascadesを制限するようにしてください。クラスをチェックする必要がある理由を見て、代わりにコードを仮想メソッドに入れることを検討するために1、2分を費やしてください。クラスタイプを絶対にテストしないと言っているわけではありませんが、少なくともそれを意識的に決定する必要があると思います:-)
if(dynamic_cast <Weapon *>(Equipment_ptr)!= NULL)//次に武器
typeid は別のオプションだと信じてください..
if (typeid(thing)==typeid(otherthing)){
//...
}