-1

可能重复:
错误:“{”标记之前的预期类名

我有一个主要的超类 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 */
4

4 回答 4

4

你有一个循环包含。从 GameObject.h 中删除这一行:

#include "GuiBitMapText.h"

您不会在 GameObject.h 中使用此类,因此甚至不需要包含该类。在某些情况下,在处理定义相互引用的类型时,您必须前向声明类,但由于GameObject没有对 进行任何引用GuiBitMapText,因此在这种情况下没有理由需要前向声明。

于 2012-12-27T13:32:44.287 回答
1

你有一个循环包含。考虑一下何时编译包含GameObject.h(例如)的内容。将被包括在内,然后在 的定义之上包括 ,然后在 的定义之上包括。但是,您的包含守卫将阻止最后一个包含实际执行任何操作,因此将无法编译,因为它之前没有定义。GameObject.cppGameObject.hGuiBitMapText.hGameObjectGameObject.hGuiBitMapTextGuiBitMapTextGameObject

GameObject甚至不依赖于GuiBitMapText,所以没有理由在#include "GuiBitMapText.h"那里。只要摆脱它,你会没事的。

于 2012-12-27T13:35:19.627 回答
0

您需要正确理解标头依赖性。

您应该了解何时实际包含标头以及何时使用前向声明。

在 GameObject 的情况下,它实际上完全没有外部依赖。您的头文件不需要包含任何其他头文件。

对于 GuiBitMapText:

  • 它是一种游戏对象。要从一个类派生,您必须包含其标题(您有)。因此保持#include GameObject.h
  • 您的班级有一个字符串作为成员。<string>所以你也需要标题
  • 你的类有一个指向 BMF 的指针。提前声明就足够了。删除包含可能会破坏一些期望此包含存在但修复该代码而不是此文件的代码。替换#include "BMF.h"class BMF;
  • 你的类有一个指向 SDL_Texture 的指针。不仅如此,这个指针只出现在类的私有部分,根本没有出现在公共接口中。(与出现在公共构造函数和类成员中的 BMF 指针不同)。所以更重要的是,在这里你应该使用前向声明。然后,您班级的用户不会获得该包含的开销。替换"#include SDL.h"class SDL_Texture;

这对学习很有用,并且将在将来以及在这种特殊情况下对您有所帮助。

将头文件更改为仅使用前向声明后,与这些文件(即 .cpp 文件)相关的编译单元现在必须包含头文件。

于 2012-12-27T14:14:20.090 回答
-1

该错误是由我有这两行的另一个文件触发的

#include "GameObject.h"
#include "GuiBitMapText.h"

我真的不需要在那个文件中包含 GuiBitMapText,所以我删除了 include GuiBitMapText,现在它可以工作了......

于 2012-12-27T14:11:32.823 回答