【问题标题】:C++ parent method access to child pointersC++父方法访问子指针
【发布时间】: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


【解决方案1】:

您需要在 Actor.cpp 中包含定义 NPC 的标头,否则将缺少 NPC 的定义。

// Actor.cpp
#include "NPC.h"

void Actor::move(std::vector<std::unique_ptr<NPC>> & NPCs)
{
    // Go through the NPCs.
    for (const auto &NPC : NPCs)
    {
        if (NPC->getOutlook() > 0) ... // Now you'll be able to access this.
    }
}

【讨论】:

    猜你喜欢
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2016-01-16
    • 2013-08-09
    相关资源
    最近更新 更多