我只想首先说我还不太适合编码,而且我一直在努力做研究而只是陷入困境,因为我无法找到我正在寻找的东西对
我正在尝试制作我的第一款游戏,一款简单的文字冒险游戏。我试图制作一个玩家的库存,所以我开始使用自定义类的向量。经过一些研究后,我发现我需要创建一个多类的基类。
仅供参考,我正在使用
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()
会给我一个错误#34;没有打印成员&#34;
结束编辑
我的map
类有一个print()
函数,我需要从向量中使用它。我是否必须在print()
类中创建一个虚拟item
函数,以便它可以使用虚拟部件向下传输,或者是否有更简单的方法来执行此操作?
抱歉,如果这是简单或愚蠢的修复,当我进行研究时,我发现所有人都试图找到名称和事物,但我无法找到如何在基类中没有它的情况下访问方法
答案 0 :(得分:0)
为了以多态方式使用基类的任何子类,您可以传递指向基类的指针或引用,并通过它调用其虚拟成员函数。
您应该仔细考虑替代方案,例如在您的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替换标记的联合。