Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;对子指针的父方法访问 我对C++很陌生,我在玩一个小游戏。我有一个名为Actor的泛型类,它有两个子类,NPC和Player。这个想法是让每个孩子都包含特定的数据,比如杀死NPC的经验或玩家的统计数据,以及特殊的方法。另一方面,Actor包含诸如move之类的通用方法,因为player和NPC都应该移动_C++_Class_Pointers_Parent Child_Code Organization - Fatal编程技术网

C++;对子指针的父方法访问 我对C++很陌生,我在玩一个小游戏。我有一个名为Actor的泛型类,它有两个子类,NPC和Player。这个想法是让每个孩子都包含特定的数据,比如杀死NPC的经验或玩家的统计数据,以及特殊的方法。另一方面,Actor包含诸如move之类的通用方法,因为player和NPC都应该移动

C++;对子指针的父方法访问 我对C++很陌生,我在玩一个小游戏。我有一个名为Actor的泛型类,它有两个子类,NPC和Player。这个想法是让每个孩子都包含特定的数据,比如杀死NPC的经验或玩家的统计数据,以及特殊的方法。另一方面,Actor包含诸如move之类的通用方法,因为player和NPC都应该移动,c++,class,pointers,parent-child,code-organization,C++,Class,Pointers,Parent Child,Code Organization,现在我有了一个NPC指针的向量,我的move方法应该检查目标磁贴是否被NPC(以及其他一些NPC信息)占用,但是我没有从Actor访问该类的权限。我在Actor的NPC中添加了一个转发声明,但随后出现以下错误: 不允许指向不完整类类型的指针 因为转发声明不足以访问NPC方法 Actor.h: class NPC; // Forward declaration. class Actor { public: void move(std::vector<std::unique_

现在我有了一个NPC指针的
向量,我的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);
}
void Actor::move(std::vector<std::unique_ptr<NPC>> & NPCs)
{
    // Go through the NPCs.
    for (const auto &NPC : NPCs)
    {
        if (NPC->getOutlook() > 0) ... // Error.
    }
}
类NPC;//远期申报。
班级演员
{
公众:
无效移动(标准::矢量和NPC);
}
Actor.cpp:

class NPC; // Forward declaration.

class Actor
{
    public:
    void move(std::vector<std::unique_ptr<NPC>> & NPCs);
}
void Actor::move(std::vector<std::unique_ptr<NPC>> & NPCs)
{
    // Go through the NPCs.
    for (const auto &NPC : NPCs)
    {
        if (NPC->getOutlook() > 0) ... // Error.
    }
}
void Actor::move(std::vector和NPCs)
{
//通过NPC。
用于(const auto和NPC:NPC)
{
如果(NPC->getOutlook()>0)//错误。
}
}
我可以将move方法放在
NPC
Player
中,但我会复制代码,这是一个非常糟糕的主意

这里的最佳解决方案是什么?我想有一个更好的方法来组织这件事,但它看起来很符合逻辑。也许是某种继承或虚拟功能


谢谢!:)

您需要在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.
    }
}
//Actor.cpp
#包括“NPC.h”
void Actor::move(std::vector和NPCs)
{
//通过NPC。
用于(const auto和NPC:NPC)
{
如果(NPC->getOutlook()>0).//现在您就可以访问它了。
}
}

是否将定义了
NPC
类的头文件包含在
Actor.cpp
源文件中?如果你想使用类的成员,你需要类定义。你可能想在Actor.cpp的顶部包含“NPC.h”
。这不会导致循环包含吗?不,诀窍是只包含
Actor.cpp
include
NPC.h
,并且
NPC.cpp
也可以包含
Actor.h
。头文件不能相互包含。这里有一些警告,比如您的接口不能按值接受
NPC
。但是我认为如果你这样做,并在
Actor.h
文件的顶部转发declare
NPC
,那就足够了。我知道,在.cpp中不会引起麻烦。我觉得自己好笨。谢谢