如果我只有一个基类指针,我该如何使用派生类?

时间:2013-01-17 07:39:09

标签: c++ polymorphism inventory

所以这就是我所得到的。

  1. 我有一个基础项目类,从中派生出魔药,装备,法术等等,并从这些类派生出几个类等等。注意:某些派生类具有非虚拟类特定的成员函数/数据类型。

  2. 我还创造了一个“随机”装甲/武器发生器。

  3. 我想要的是像这样的库存:

    struct Hero_Inventory
    {
       std::vector<Spell*> Spell_Inventory;
       std::vector<Potion*> Potion_Inventory;
       std::vector<Equipment*> Equipment_Inventory; 
    
       Hero_Inventory() {}
    };
    

    为我的法术和魔药创建一个容器(库存)非常简单。因为它们将被预定义。使用多态和指针不会成为问题

    我的主要问题是找出存储和使用(例如访问武器级别的特定成员函数)我随机生成的武器/装甲(两者都来自装备)。

    我希望我的所有“装备”都在一个容器中。

    我在一些函数中生成了所有的设备,所以当我完成生成过程并最终得到类似的东西时:

    Equipment * TestArmor = new Armor(/* Bunch of parameters go here */);
    

    我不知道该怎么做,因为只要该功能超出范围,我就会松开那个指针。没有指针/引用我不能使用多态,这允许我将我的设备全部保存在一个容器中。

    我现在真的迷失了,我正在寻找人们可以建议的任何建议或替代方案。如果您需要更多代码,我会发布它,只需告诉我您感兴趣的部分。

    对不起,如果我一直含糊不清,这是我的第一篇文章。我通常很擅长自己解决问题,但这件事让我好斗。如果有人需要更多信息,我会尽力提供。

    提前致谢, -Ryan

1 个答案:

答案 0 :(得分:2)

创建一个统一的界面来操作Equipment对象:

class Equipment {
public:
    virtual void render(Renderer& renderer) = 0;
    virtual void createController(ControllerManager& controllerManager) = 0;
    virtual void load(std::istream& input) = 0;
    virtual void save(std::ostream& output) = 0;
};

函数createController很有意思,因为设备将能够告诉ControllerManager如何创建将操纵其精确值的内容。

如果您想要一个允许与其他Equipment对象交互的功能,您可能需要Visitor Pattern。这是一种基于多种类型而不是单一类型引入多态的方法。