让我们说我有3个不同的类:装备,武器和工具。武器和工具继承了装备。我创建了一个Weapon或Tool对象并将其添加到Equipment数组中。当我检索对象时,如何编写“IF”语句以检查此对象是否为武器或工具?
由于
答案 0 :(得分:1)
使用dynamic_cast如下:
Equipment *pMyObj = ... //got it somewhere
Weapon *pWeapon = dynamic_cast<Weapon *>(pMyObj);
if( pWeapon != NULL ){
//you have weapon
}
答案 1 :(得分:0)
你在谈论RTTI(link)但是如果你在你的装备基类中保留一个'type'枚举可能会更好,然后只需检查它以找出派生类型是什么。然后,您只需将dynamic_cast
设备对象转换为正确的派生类型。
答案 2 :(得分:0)
if(dynamic_cast&lt; Weapon *&gt;(Equipment_ptr)!= NULL)//然后武器
答案 3 :(得分:0)
相信typeid是另一种选择..
if (typeid(thing)==typeid(otherthing)){
//...
}
答案 4 :(得分:0)
虽然我对dynamic_cast感觉有些混乱。
虽然它会起作用,但如果选择的数量增加,它可能不是最佳选择。在这种情况下,我更喜欢“kind” - 枚举和虚拟GetKind()方法。这允许在枚举上有一个很好的switch()语句,如果你忘记列出其中一个枚举值,大多数编译器甚至应该能够发出警告。
由于您已经知道在案例中您正在处理哪个类:部分,您不再需要dynamic_cast,因此您不需要执行相同的检查两次。
当然,请尽量保持你的switch()或if-else-cascades有限;看看为什么需要检查类,并花一两分钟考虑将代码放入虚拟方法中。我不是说从不测试班级类型,但我认为至少应该做出一个有意思的决定: - )