如何在c ++

时间:2018-02-12 19:30:37

标签: c++ class vector subclass

我只想首先说我还不太适合编码,而且我一直在努力做研究而只是陷入困境,因为我无法找到我正在寻找的东西对

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

仅供参考,我正在使用

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函数,以便它可以使用虚拟部件向下传输,或者是否有更简单的方法来执行此操作?

抱歉,如果这是简单或愚蠢的修复,当我进行研究时,我发现所有人都试图找到名称和事物,但我无法找到如何在基类中没有它的情况下访问方法

1 个答案:

答案 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替换标记的联合。