-1

重複の可能性:
エラー: '{' トークンの前にクラス名が必要です

1 つのメイン スーパークラス GameObject と派生クラス GuiBitMapFont があります。予期されるクラス名エラーが常にスローされます。しかし、GuiBitMapFont class GameObject;に前方派生を追加するとします。不完全なタイプ 'class GameObject' の無効な使用と 'class GameObject' の前方宣言をスローします。

編集 はい、GameObject ファイルに #include GuiBitMapFont がありました。しかし、それはこの質問を書いているときの私の間違いでした。コンパイラはこれら 2 つのエラーをスローします。

#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.cpp)がいつコンパイルされるかを考えてください。GameObject.hが含まれ、次にGuiBitMapText.h、の定義の上に含まれ、次に、の定義の上にGameObject含まれます。ただし、インクルードガードは、この最後のインクルードが実際に何も実行しないようにするため、その前に定義されていないため、コンパイルできません。GameObject.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

エラーは、この2行がある別のファイルによってトリガーされました

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

そのファイルに GuiBitMapText を含める必要は本当になかったので、GuiBitMapText のインクルードを削除したところ、動作するようになりました...

于 2012-12-27T14:11:32.823 に答える