我有一个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)
我发现了很多其他主题,但它们并没有真正解决我遇到的问题.所以问题是:为什么我会收到此错误,如何解决?
您的代码存在一些问题:
GameObject.h包括Component.h,Component.h包括GameObject.h.
这种循环依赖会破坏一切.根据您从"开始"的文件,由于包含防护,因此GameObject不会显示任何文件,Component反之亦然.
删除循环依赖:你根本不需要那些#include,因为你已经使用了前向声明.通常,最小化#include标头的使用.
当你修复它时,添加缺少};的Component.h.
(你的定义Transform认为它是一个嵌套类Component,在那里,还没有完全定义.)
这可能不会导致您今天遇到实际问题,但您的宏名称不应该_以为实现(编译器)使用而保留的名称开头.