c ++基类未定义.在另一个类中包含base和subclass

Mat*_*hew 2 c++ inheritance

我有一个GameObject类,它有一个Component和Transform的向量.Transform是一个Component,但可以自己访问.当我尝试在GameObject中包含Component.h和Transform.h时,我在Component上得到一个Base类未定义的错误.

错误信息:

    Error   1   error C2504: 'Component' : base class undefined c:\users\pyro\documents\visual studio 2010\projects\engine\main\transform.h 9
Run Code Online (Sandbox Code Playgroud)

GameObject.h

    #ifndef _GameObject
    #define _GameObject
    #include "Core.h"
    #include "Component.h"
    #include "Transform.h"

    class Transform;
    class Component;

    class GameObject
    {
        protected:
            Transform* transform;
            vector<Component*> components;
    };

    #endif
Run Code Online (Sandbox Code Playgroud)

Component.h

    #ifndef _Component
    #define _Component

    #include "Core.h"
    #include "GameObject.h"

    class GameObject;

    class Component
    {
    protected:
        GameObject* container;
    };
    #endif
Run Code Online (Sandbox Code Playgroud)

Transform.h

    #ifndef _Transform
    #define _Transform

    #include "Core.h"
    #include "Component.h"

    //Base class undefined happens here
    class Transform : public Component
    {
    };

    #endif
Run Code Online (Sandbox Code Playgroud)

我发现了很多其他主题,但它们并没有真正解决我遇到的问题.所以问题是:为什么我会收到此错误,如何解决?

Lig*_*ica 9

您的代码存在一些问题:


1.循环依赖

GameObject.h包括Component.h,Component.h包括GameObject.h.

这种循环依赖会破坏一切.根据您从"开始"的文件,由于包含防护,因此GameObject不会显示任何文件,Component反之亦然.

删除循环依赖:你根本不需要那些#include,因为你已经使用了前向声明.通常,最小化#include标头的使用.


2.语法错误

当你修复它时,添加缺少};Component.h.

(你的定义Transform认为它是一个嵌套类Component,在那里,还没有完全定义.)


3.保留名称

这可能不会导致您今天遇到实际问题,但您的宏名称不应该_以为实现(编译器)使用而保留的名称开头.

  • @Johnsyweb:前瞻声明不是设计气味. (4认同)
  • @Matthew:如果你想赢得一个混淆的编程竞赛,那么循环和递归包含是一个好主意.否则他们会让你陷入麻烦,就像他们在这里一样. (2认同)