我有一个主要的超类GameObject和派生类GuiBitMapFont。它总是抛出预期的类名错误。但是如果我要在GuiBitMapFont 类GameObject中添加前向派生; 它会抛出无效使用不完整类型'class GameObject'和'class GameObject'的前向声明
修改 是的,GameObject文件中有#include GuiBitMapFont。但在写这个问题时,这是我的错误。编译器仍然会抛出这两个错误。
#ifndef GAMEOBJECT_H
#define GAMEOBJECT_H
#include <string>
#include "Texture.h"
class GameObject {
private:
int x;
int y;
int width;
int height;
public:
GameObject();
GameObject(int x, int y, int width, int height);
GameObject(const GameObject& orig);
virtual ~GameObject();
virtual void draw();
virtual void update();
//ignore those, i need to rewrite it....
void setX(int x);
void setY(int y);
void setWidth(int width);
void setHeight(int height);
int getX() const;
int getY() const;
int getWidth() const;
int getHeight() const;
};
#endif /* GAMEOBJECT_H */
和派生
#ifndef GUIBITMAPTEXT_H
#define GUIBITMAPTEXT_H
#include <string>
#include "SDL.h"
#include "GameObject.h"
#include "BMF.h"
class GuiBitMapText : public GameObject { //error: expected class-name before '{' token
private:
std::string text;
BMF *font;
//SDL_Surface *surf;
SDL_Texture *texture;
public:
GuiBitMapText(int x, int y, std::string text, BMF *font);
GuiBitMapText(const GuiBitMapText& orig);
virtual ~GuiBitMapText();
virtual void draw();
virtual void update();
};
#endif /* GUIBITMAPTEXT_H */
答案 0 :(得分:4)
你有一个循环包含。从GameObject.h中删除这一行:
#include "GuiBitMapText.h"
你不在GameObject.h中使用这个类,所以不需要包括甚至在那里。在某些情况下,您必须在处理其定义相互引用的类型时转发声明类,但由于GameObject
未对GuiBitMapText
进行任何引用,因此您没有理由需要转发 - 在这个例子中声明。
答案 1 :(得分:1)
你有一个循环包含。考虑何时编译包含GameObject.h
(例如GameObject.cpp
)的内容。将包含GameObject.h
,其中GuiBitMapText.h
包含GameObject
的定义,然后在GameObject.h
的定义之上包含GuiBitMapText
。但是,你的包含守卫会阻止最后一次包含实际做任何事情,因此GuiBitMapText
将无法编译,因为GameObject
之前没有定义。
但GameObject
甚至不依赖于GuiBitMapText
,因此没有理由让#include "GuiBitMapText.h"
出现。只是摆脱它,你会没事的。
答案 2 :(得分:0)
您需要正确理解标头依赖关系。
您应该知道何时实际包含标题以及何时使用转发声明。
对于GameObject,它实际上根本没有外部依赖。您的头文件无需包含任何其他标头。
对于GuiBitMapText:
#include GameObject.h
<string>
的标题#include "BMF.h"
替换为class BMF;
"#include SDL.h"
替换为class SDL_Texture;
这是一个有用的东西,可以在将来以及在这种特殊情况下为您提供帮助。
将标题更改为仅使用前向声明后,与这些文件相关的编译单元(即.cpp文件)现在必须包含标题。
答案 3 :(得分:-1)
错误是由另一个文件触发的,我有这两行
#include "GameObject.h"
#include "GuiBitMapText.h"
我真的不需要在该文件中包含GuiBitMapText,所以我删除了包含GuiBitMapText,现在它可以工作......