1

假设我有 3 个不同的类别:设备、武器和工具。武器和工具继承装备。我创建了一个 Weapon 或 Tool 对象并将其添加到 Equipment 数组中。当我检索对象时,如何编写“IF”语句来检查该对象是武器还是工具?

谢谢

4

5 回答 5

1

使用 dynamic_cast 如下:

Equipment *pMyObj = ... //got it somewhere

Weapon *pWeapon = dynamic_cast<Weapon *>(pMyObj);

if( pWeapon != NULL ){ 
 //you have weapon 
}
于 2012-07-18T18:24:40.360 回答
0

您正在谈论 RTTI ( link ),但是如果您在 Equipment 基类中保留一个“类型”枚举可能会更好,然后只需检查它以找出派生类型是什么。然后,您可以dynamic_cast将 Equipment 对象设置为正确的派生类型。

于 2012-07-18T18:25:14.523 回答
0

if (dynamic_cast< Weapon* >(Equipment_ptr) != NULL) // 然后是 Weapon

于 2012-07-18T18:25:31.183 回答
0

相信 typeid 是另一种选择..

if (typeid(thing)==typeid(otherthing)){
  //...
}
于 2012-07-18T18:27:32.807 回答
0

不过,我对 dynamic_cast 的感觉有些复杂。

虽然它会起作用,但如果选择的数量可以增加,它可能不是最佳选择。在这种情况下,我更喜欢“种类”枚举和虚拟 GetKind() 方法。这允许在枚举上使用一个不错的 switch() 语句,如果您忘记列出枚举值之一,大多数编译器甚至应该能够警告您。

由于您已经知道在 case: 部分中处理的是什么类,因此您不再需要 dynamic_cast,因此您不需要两次进行相同的检查。

Of course, DO try to keep your switch() or if-else-cascades limited; take a look at why you need to check for the class, and spend a minute or two to consider putting the code into a virtual method instead. I'm not saying to never test for the class type, but I think one should at least make it a concious decision :-)

于 2012-07-18T18:36:58.017 回答