gpt4 book ai didi

c++ - 如何在 C++ 中的 vector 中存储和使用不同的类

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:41:41 24 4
gpt4 key购买 nike

首先,我只想说,我对编码仍然是个新手,我一直在尝试进行研究,但被卡住了,因为我找不到我要找的东西。

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

仅供引用,我正在使用

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() 时出现“no member of print”的错误在项目中”

结束编辑

我的 map 类有一个 print() 函数,我需要从 vector 中使用它。我是否必须在我的 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 ,标记 union 的 STL 替代品。

关于c++ - 如何在 C++ 中的 vector 中存储和使用不同的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48754125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com