将变量设置为类型模板

时间:2018-08-21 02:44:45

标签: c++ templates game-engine

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

使用工厂方法设计模式:

“在基于类的编程中,工厂方法模式是一种创建模式,该模式使用工厂方法来处理创建对象的问题,而不必指定将要创建的对象的确切类。这是通过创建通过调用工厂方法(不是在接口中指定并由子类实现,还是在基类中实现并可选地由派生类覆盖)来实现对象,而不是通过调用构造函数。”

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