【发布时间】:2021-05-27 08:58:21
【问题描述】:
Weapon 继承自 Item。
weapon 是 Hero 类的成员。我想将其与函数中传递的item 进行交换,对于本示例,它也是Weapon(我将添加更多案例)。
void Hero::equip(Item* item){
if(instanceof<Weapon>(item)){std::swap (item, static_cast<Item>(weapon));}
}
基本上,当从英雄的库存中装备某些东西时,我希望它存储在Hero的相应成员中,而之前装备的item将重新存储在库存中,无论项目类型。库存是std::vector<Item*>,因此它可以容纳多态物品。
向上转换weapon 似乎不起作用,因为Item 是虚拟的。我尝试过的所有其他类型的铸造也失败了,一些手动交换它们的尝试也是如此。如果您想知道 instanceof,我复制了这个模板,以便在 C++ 中使用它:
template<typename Base, typename T>
inline bool instanceof(const T *ptr) {
return dynamic_cast<const Base*>(ptr) != nullptr;
}
当我使用Item* 而不是Item 时,我得到:
调用'swap(Item*&, Item*)'没有匹配的函数
【问题讨论】:
-
提示:你不想交换
Items,你想交换Item*s -
另外,在处理多态性时,您要查找的演员表是
dynamic_cast -
你为什么使用交换而不是替换?
weapon的确切声明是什么? -
您可能应该想出一个更完整的minimal reproducible example,因为您当前的代码似乎有几个缺陷。 (例如,与
Item*类型的参数交换不会影响库存,但Item*&可能。)最好显示给出错误消息的代码,因为可能在正确的轨道。 -
@GeorgeT 您可能有兴趣阅读Markdown Editing Help,尤其是“代码跨度”部分。
标签: c++ inheritance casting polymorphism instanceof