【问题标题】:How do I use derived classes if I only have a base class pointer?如果我只有一个基类指针,如何使用派生类?
【发布时间】:2013-01-17 07:39:08
【问题描述】:

简而言之,这就是我得到的。

  1. 我有一个基础项目类,药水、设备、法术等都从该类派生而来,并且从这些类派生了几个类,依此类推。注意:一些派生类具有非虚拟类特定的成员函数/数据类型。

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

我想要的是这样的库存:

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

   Hero_Inventory() {}
};

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

我的主要问题是弄清楚如何存储和使用(例如访问武器类的特定成员函数)我随机生成的武器/盔甲(它们都来自 Equipment)。

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

我在几个函数中生成我所有的设备,所以当我完成生成过程并最终得到如下结果时:

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

我不知道如何处理它,因为一旦该函数超出范围,我就会失去该指针。如果没有指针/引用,我就不能使用多态性,这使我可以将我的设备全部保存在一个容器中。

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

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

提前致谢, -瑞安

【问题讨论】:

  • 这里的问题是什么?为什么不将其添加到Equipment_Inventory
  • 不要查询具体武器的属性,通过统一的界面告诉他们该做什么。他们可以决定他们能做什么。
  • @Karthik T:我无法添加它的原因是,一旦我的盔甲生成器功能完成,我的指针就会变成垃圾。因为那时,它现在超出了范围。对?我很确定动态内存就是这样工作的。
  • @RyanNolan:这不准确。指针超出范围,但只要该对象处于活动状态,就可以存储值(即您的 TestArmor 对象的地址)。
  • @Peter Wood:这是解决问题的一种有趣方式。一个我以前没有考虑过的。我真的很喜欢使用多态性。我会看看我能想出什么。

标签: c++ polymorphism inventory


【解决方案1】:

创建一个统一的接口来操作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。这是一种基于多种类型而不是单一类型引入多态性的方式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2020-04-07
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多