【发布时间】:2018-07-23 01:47:25
【问题描述】:
我只想首先说我对编码还是很陌生,而且我一直在尝试进行研究但只是卡住了,因为我找不到我正在寻找的确切内容。
我正在尝试制作我的第一款游戏,一款简单的文字冒险游戏。我试图制作玩家的库存,所以我开始使用自定义类的向量。经过一番研究,我发现我需要制作一个包含多个类的基类。
仅供参考,我正在使用
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 文件在上面展开。
存储的时候发现要加虚函数才能得到名字,所以我加了一个name数据成员,做了一个getName()函数,把它变成了虚函数。最终我能够把物品拿出来并得到名字,但后来我发现了一个我找不到答案的新问题。
编辑:
使用inventory.push_back(&map) 后,尝试调用(inventory[0])->print() 时出现“项目中没有打印成员”的错误
结束编辑
我的map 类有一个print() 函数,我需要从向量中使用它。我是否必须在我的 item 类中创建一个虚拟的 print() 函数,以便它可以使用虚拟部分向下传递,或者有更简单的方法吗?
对不起,如果这是简单或愚蠢的修复,当我进行研究时,我发现的只是人们试图查找名称和事物,但我无法找到如何访问没有基类中的方法。
【问题讨论】:
-
请给minimal reproducible example。您的最后几段还应显示您用文字描述的代码。
-
这取决于你想让
print做什么。如果您只想要名称,则可以使用已有的getName函数。 -
在遵循多态范式时使用
std::vector<std::shared_ptr<Base>> v;。 -
"我的地图类有一个 print() 函数,我需要从向量中使用它。"如果打印对所有
items 都没有意义,那么您就没有资格从std::vector<item*>调用它。重新思考您的设计。 -
你掉进了初学者的陷阱,想要在你的容器中存储不同的类型,这会导致(甚至可能是手动的)动态内存分配、指针语义、不知道你的容器中有什么对象、强制转换和一堆其他讨厌的东西。重新考虑你的前提。不要将不同的类型放在同一个容器中,一切都会变得容易得多。