我有一个GameObject类,它具有Component和Transform的 vector 。
变换是一个组件,但可以单独访问。
尝试在GameObject中同时包含Component.h和Transform.h时,在Component上出现基类未定义错误。
错误信息:
Error 1 error C2504: 'Component' : base class undefined c:\users\pyro\documents\visual studio 2010\projects\engine\main\transform.h 9
游戏对象
#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
组件.h
#ifndef _Component
#define _Component
#include "Core.h"
#include "GameObject.h"
class GameObject;
class Component
{
protected:
GameObject* container;
};
#endif
转换h
#ifndef _Transform
#define _Transform
#include "Core.h"
#include "Component.h"
//Base class undefined happens here
class Transform : public Component
{
};
#endif
我发现了很多其他主题,但是它们并没有真正解决我遇到的问题。
所以问题是这样的:为什么我会收到此错误?如何解决?
最佳答案
您的代码有两个问题:
1.循环依赖GameObject.h
包括Component.h
,Component.h
包括GameObject.h
。
这种循环依赖关系破坏了一切。由于包含保护措施的原因,根据GameObject
看不到Component
或反之亦然,这取决于您是“起始于”哪个文件。
删除循环依赖项:,因为您已经在使用正向声明,所以您根本不需要那些#include
。 通常,在 header 中尽量减少使用#include
。
2.语法错误
解决此问题后,在};
中添加缺少的Component.h
。
(您对Transform
的定义认为它是Component
内的嵌套类,当时尚未完全定义。)
3.保留名称
今天,这可能不会给您带来实际问题,但是您的宏名称不应以_
开头,因为它们保留供实现(编译器)使用。
关于c++ - c++基类未定义。在另一个类中包括基类和子类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14177159/