![](/img/trans.png)
[英]In C++, How do I store values into a vector that is inside of a vector when the two vectors are of different types?
[英]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.