将变量设置为类型模板

Setting Variables as Type Template

本文关键字:类型 变量 设置      更新时间:2023-10-16

所以我正在开发一个基于文本的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()'中运行函数时出现的此错误中。尽管我对这个问题进行了研究,但我不明白我做错了什么!任何帮助或新建议将不胜感激。谢谢!

这需要在运行时完成,因此模板不是正确的工具。相反,您应该使用dynamic_cast

void MyCharacter::equipWeapon() {
Item item = myInventory.chooseItem();
if (Weapon* weapon = dynamic_cast<Weapon*>(&item)) {
// Equip the weapon
}
}

使用工厂方法设计模式:

"在基于类的编程中,工厂方法模式是一种创建模式,它使用工厂方法来处理创建对象的问题,而不必指定将要创建的对象的确切类。这是通过调用工厂方法(在接口中指定并由子类实现,或者在基类中实现并选择性地由派生类重写(来创建对象来完成的,而不是通过调用构造函数来完成的。

https://en.wikipedia.org/wiki/Factory_method_pattern