【发布时间】:2017-03-16 12:58:06
【问题描述】:
我对 C++ 还很陌生,我正在做一个小 Roguelike 游戏。我有一个名为Actor 的通用类,它有2 个子类NPC 和Player。这个想法是让每个孩子都包含特定的数据,例如通过杀死 NPC 或玩家的统计数据提供的经验以及特殊方法。另一方面,Actor 包含移动等通用方法,因为玩家和 NPC 都应该移动。
现在我有一个vector of NPC pointers,我的 move 方法应该检查目标图块是否被 NPC(以及其他一些 NPC 信息)占用,但我无法从 Actor 访问该类。我在Actor 内向NPC 添加了前向声明,但随后出现此错误:
不允许指向不完整类类型的指针
因为前向声明不足以访问NPC 方法。
Actor.h:
class NPC; // Forward declaration.
class Actor
{
public:
void move(std::vector<std::unique_ptr<NPC>> & NPCs);
}
Actor.cpp:
void Actor::move(std::vector<std::unique_ptr<NPC>> & NPCs)
{
// Go through the NPCs.
for (const auto &NPC : NPCs)
{
if (NPC->getOutlook() > 0) ... // Error.
}
}
我可以将 move 方法放在 NPC 和 Player 中,但我会复制代码,这是一个非常糟糕的主意。
这里最好的解决方案是什么?我想有更好的方法来组织这个,但它看起来很合乎逻辑。也许是某种继承或虚函数魔法?
谢谢! :)
【问题讨论】:
-
您是否将定义
NPC类的头文件包含在您的Actor.cpp源文件中?如果要使用类的成员,则需要类定义。 -
你可能想
#include "NPC.h"在 Actor.cpp 的顶部。 -
这不会导致循环包含吗?
-
不,诀窍是只有
Actor.cpp包含NPC.h,NPC.cpp也可以包含Actor.h。头文件不能相互包含。对此有一些注意事项,例如您的接口不能按价值采用NPC。但我认为,如果你这样做,并在Actor.h文件的顶部转发声明NPC,那就足够了。 -
我明白了,在 .cpp 中不会造成麻烦。我觉得自己很笨xD。谢谢!
标签: c++ class pointers parent-child code-organization