繁体   English   中英

如何在C ++中的向量中存储和使用不同的类

[英]How do I store and use different classes in a vector in c++

我只想从一开始就说我对编码仍然很陌生,而且我一直在尝试进行研究,但由于无法找到我想要的东西而被卡住了。

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

仅供参考,我正在使用

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文件。

当存储它时,我发现我必须添加虚拟函数来获取名称,因此我添加了一个名称数据成员并创建了getName()函数并将其虚拟化。 最终,我能够取出物品并获得名称,但是后来我发现了一个新的问题,找不到答案。

编辑:

使用inventory.push_back(&map) ,尝试调用(inventory[0])->print()会给我错误“项目中没有打印成员”

结束编辑

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

抱歉,如果这很简单或很愚蠢,当我进行研究时,我发现所有的人都在试图查找名称和事物,但是如果没有基类中的方法,我将找不到方法。

为了多态使用基类的任何子类,您将传递一个指向基类的指针或引用,并通过该指针或基类调用其虚拟成员函数。

您应该仔细考虑其他选择,例如将Plain-Old-Data存储在vector而不是将所有类都存储在类中。 子类之间实际上有多少种方法会有不同的实现?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM