'令牌类继承之前的c ++预期类名[重复]

Posted

技术标签:

【中文标题】''令牌类继承之前的c ++预期类名[重复]【英文标题】:c++ expected class-name before '' token class inheritance [duplicate]''令牌类继承之前的c ++预期类名[重复] 【发布时间】:2012-12-27 13:29:29 【问题描述】:

可能重复:error: expected class-name before ‘’ token

我有一个主要的超类 GameObject 和派生类 GuiBitMapFont。它总是抛出预期的类名错误。但是,如果我将在 GuiBitMapFont class GameObject; 中添加前向推导,它会抛出 invalid use of incomplete type 'class GameObject'forward declaration of '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 */

【问题讨论】:

@Zaraka 在 GameObject.h 的开头曾经有 #include GuiBitMapText.h,所有答案和 cmets 都正确指出这个“包含”不应该存在。但是您似乎已在快速编辑中将其删除。为什么? 因为它不应该在那里,所以它被评论了,没有那行它仍然抛出同样的错误 请在此帖子的 current 源中添加评论,指出错误仍然发生的 exact 行,因为您更改了问题代码并有效地使之前的每个正确答案无效。 @Zaraka,当您使用它时,您是否还可以删除标记为“忽略那些,我需要重写它们”的函数,以及可能不需要重现的所有包含、类型和数据成员问题?这可能有点工作,但它会帮助您和 SO 社区更好地理解问题。 @jogojapan 我已经评论了 GameObject 中的所有内容,除了构造函数和析构函数......仍然是同样的错误 【参考方案1】:

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

#include "GuiBitMapText.h"

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

【讨论】:

那是错字,它不应该在那里。忽略它,它仍然会抛出同样的错误 我看不出如果您确实删除了该包含行,它会如何给您该错误,除非您没有向我们展示这两个文件的更多内容。 我只在不同的文件中使用 GameObject。但其他一切都在这里。是的,我确定。 @KillianDS 与 GameObject 或 GuiBitMapFont 无关。 您得到的错误是在 之前需要一个类名 - 这意味着您在以某种方式使用它之前没有声明class。 99% 肯定是“包含文件问题”。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

你需要正确理解头部依赖。

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

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

以 GuiBitMapText 为例:

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

这是有用的学习内容,并且会在未来以及在这种特殊情况下对您有所帮助。

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

【讨论】:

GameObject之所以有这些包含是因为它也有字符串变量和纹理变量,后来我认为这两个变量是必要的并删除了它们,但是忘记删除那些包含......我改变了一切除了 SDL.h,因为 SDL.h 是带有我使用的函数的 C 库,所以我无法访问它们。 如果 SDL_Texture 是一个结构而不是一个类,那么将结构放在你的前向声明中,但仍然在你的标题中使用前向声明。然后在您的编译单元中,即您的 .cpp 文件中包含标题。 但是现在。我不能在 GuiBitMapText.cpp 文件中使用 BMF 类。当我尝试使用一些类方法时。编译器抛出“不完整类型'class BMF'的无效使用” 他们告诉我,我的 .cpp 文件除了头文件之外不应该包含任何其他内容...我很困惑...【参考方案4】:

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

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

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

【讨论】:

这在其他几个答案中明确说明,它是另一个文件,而不是发布的文件只是一个细节(适合发表评论)。您应该删除它并接受其他答案之一

以上是关于'令牌类继承之前的c ++预期类名[重复]的主要内容,如果未能解决你的问题,请参考以下文章

非常基本的继承:错误:“”标记之前的预期类名

继承的方法不会改变变量值

C++:错误:“”标记之前的预期类名

C++ 错误:预期的类成员或基类名称 ...int e、int f、string pa、string direct、string distrib):公共视频

对象之前的预期')'。类没有命名类型[重复]

令牌SDL错误之前的预期类名[关闭]