【问题标题】:How do I store and use different classes in a vector in c++如何在 C++ 中的向量中存储和使用不同的类
【发布时间】:2018-07-23 01:47:25
【问题描述】:

我只想首先说我对编码还是很陌生,而且我一直在尝试进行研究但只是卡住了,因为我找不到我正在寻找的确切内容。

我正在尝试制作我的第一款游戏,一款简单的文字冒险游戏。我试图制作玩家的库存,所以我开始使用自定义类的向量。经过一番研究,我发现我需要制作一个包含多个类的基类。

仅供参考,我正在使用

vector<item*> inventory;

class Map : public item
{
public:
    void print();
    virtual string getName(){return name;};
private:
    string name = "Map";
}; 


class Compass : public item
{
public:
    virtual string getName(){return name;};
private:
    string name = "Compass";
};


class item
{
public:
    virtual string getName(){return name;};
private:
    string name = "item";
};

这是在我的头文件中,我有 cpp 文件在上面展开。

存储的时候发现要加虚函数才能得到名字,所以我加了一个name数据成员,做了一个getName()函数,把它变成了虚函数。最终我能够把物品拿出来并得到名字,但后来我发现了一个我找不到答案的新问题。

编辑:

使用inventory.push_back(&amp;map) 后,尝试调用(inventory[0])-&gt;print() 时出现“项目中没有打印成员”的错误

结束编辑

我的map 类有一个print() 函数,我需要从向量中使用它。我是否必须在我的 item 类中创建一个虚拟的 print() 函数,以便它可以使用虚拟部分向下传递,或者有更简单的方法吗?

对不起,如果这是简单或愚蠢的修复,当我进行研究时,我发现的只是人们试图查找名称和事物,但我无法找到如何访问没有基类中的方法。

【问题讨论】:

  • 请给minimal reproducible example。您的最后几段还应显示您用文字描述的代码。
  • 这取决于你想让print做什么。如果您只想要名称,则可以使用已有的getName 函数。
  • 在遵循多态范式时使用std::vector&lt;std::shared_ptr&lt;Base&gt;&gt; v;
  • "我的地图类有一个 print() 函数,我需要从向量中使用它。"如果打印对所有items 都没有意义,那么您就没有资格从std::vector&lt;item*&gt; 调用它。重新思考您的设计。
  • 你掉进了初学者的陷阱,想要在你的容器中存储不同的类型,这会导致(甚至可能是手动的)动态内存分配、指针语义、不知道你的容器中有什么对象、强制转换和一堆其他讨厌的东西。重新考虑你的前提。不要将不同的类型放在同一个容器中,一切都会变得容易得多。

标签: c++ class vector subclass


【解决方案1】:

为了多态地使用基类的任何子类,你需要传递一个指向基类的指针或引用,并通过它调用它的虚成员函数。

您应该仔细考虑替代方案,例如将 Plain-Old-Data 存储在您的 vector 中,而不是存储所有内容的类。有多少方法在子类之间实际上会有不同的实现?

您可以使用的一种数据结构是std::vector&lt;std::unique_ptr&lt;item&gt; &gt;。您将创建诸如std::unique_ptr&lt;item&gt;(static_cast&lt;item*&gt;(new compass)) 之类的项目,或者作为快捷方式inventory.emplace_back(...)。这会自动处理内存管理。然后您可以调用诸如inventory[0]-&gt;getname(); 之类的方法。但是,请确保析构函数 ~item()virtual,即使它只是 virtual ~item() = default; 否则,会调用错误的析构函数!

另一种选择是std::variant,它是标记联合的 STL 替代品。

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 2015-10-24
    • 1970-01-01
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2015-07-13
    相关资源
    最近更新 更多