所以我正在研究基于文本的RPG,但遇到了一个问题。我正在研究角色从其库存中装备武器的能力。我有类型Weapon
,它是类型Item
的子类;我还可以将其他各种类别的类型存储在播放器的清单中。我现在正在研究的是确保玩家想要装备的物品是Weapon
类型的物品;在这种情况下,我正在使用模板(我对使用模板还是比较陌生的),以便可以进行某种通用类型的测试。代码如下:
template <class T>
void MyCharacter::equipWeapon(){
Weapon testForEquipping;
T chosenWeapon;
chosenWeapon = myInventory.chooseItem();
if(typeid(chosenWeapon).name() == typeid(testForEquipping).name()){
//Haven't added what will happen with this part yet.
}
Weapon tempWeapon1 = equippedWeapon;
Weapon tempWeapon2 = chosenWeapon;
equippedWeapon = tempWeapon2;
chosenWeapon = tempWeapon1;
}
如您所见,我想将chosenWeapon
设置为等于玩家库存中所选的物品; (这部分有效)。但是,问题出在我尝试在程序error: no matching function for call to 'MyCharacter::equipWeapon()'
中运行该函数时遇到的错误内。尽管我对此问题进行了研究,但我不明白自己在做错什么!任何帮助或新建议,我们将不胜感激。谢谢!
答案 0 :(得分:0)
这需要在运行时完成,因此模板不是正确的工具。相反,您应该使用dynamic_cast
:
void MyCharacter::equipWeapon() {
Item item = myInventory.chooseItem();
if (Weapon* weapon = dynamic_cast<Weapon*>(&item)) {
// Equip the weapon
}
}
答案 1 :(得分:0)
使用工厂方法设计模式:
“在基于类的编程中,工厂方法模式是一种创建模式,该模式使用工厂方法来处理创建对象的问题,而不必指定将要创建的对象的确切类。这是通过创建通过调用工厂方法(不是在接口中指定并由子类实现,还是在基类中实现并可选地由派生类覆盖)来实现对象,而不是通过调用构造函数。”