2012-12-27 81 views
-1

可能重複:
error: expected class-name before ‘{’ tokenC++預期類名 '{' 令牌類繼承

我有一個主要的超一流的遊戲對象和派生類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

@Zaraka曾經有在GameObject.h年初'的#include GuiBitMapText.h',和所有的答案和意見正確指出,這「包括」不應該存在。但是你似乎已經通過快速編輯刪除了它。爲什麼? – jogojapan

+0

因爲它不應該在那裏它已被評論,沒有這條線,它仍然會拋出相同的錯誤 – Zaraka

+1

請在這個帖子的**當前**源代碼發表評論,表示錯誤仍然發生在那裏的*確切*行,現在你改變了問題代碼,並有效地使每個以前正確的答案無效。 – WhozCraig

回答

4

你有一個圓形包括。從GameObject.h刪除此行:

#include "GuiBitMapText.h" 

你不使用這個類在GameObject.h,所以沒有必要對包括甚至在那裏。有些情況下,在處理定義相互引用的類型時,您必須提前聲明類,但由於GameObject沒有提及GuiBitMapText,所以在這種情況下沒有理由需要轉發聲明。

+0

這是錯字,它不應該在那裏。忽略它,它仍然會拋出相同的錯誤 – Zaraka

+1

如果您確實刪除了包含的行,我不會看到它會如何*給出錯誤信息,除非這兩個文件中沒有更多內容顯示您。 – cdhowie

+0

@Zaraka你確定*? –

1

您有一個循環包含。考慮一下包括GameObject.h(如GameObject.cpp)在內的東西是否正在編譯。將包括GameObject.h,其然後包括高於GameObject的定義的GuiBitMapText.h,其然後包括高於GuiBitMapText的定義的GameObject.h。然而,你的防守隊員會阻止這個最後的包含實際做任何事情,所以GuiBitMapText將無法​​編譯,因爲GameObject沒有定義在它之前。

但是GameObject甚至不取決於GuiBitMapText,所以沒有理由在那裏有#include "GuiBitMapText.h"。只要擺脫它,你會沒事的。

-1

錯誤是由另一個文件,其中我有這樣兩行

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

我真的沒有需要包括GuiBitMapText在該文件中觸發,所以我刪除了包括GuiBitMapText和現在的作品...

+0

在其他幾個答案中明確指出,這是另一個文件,而不是發佈的文件僅僅是一個細節(適合評論)。你應該刪除它,並接受其他答案之一 – KillianDS

0

您需要正確理解標題依賴關係。

您應該瞭解何時實際包含標題以及何時使用前向聲明。

在GameObject的情況下,它實際上沒有任何外部依賴關係。您的頭文件不需要包含任何其他頭文件。

在GuiBitMapText的情況下:

  • 它是一種類型的遊戲對象的。要從一個類派生,你必須包含它的標題(你有)。因此請保持#include GameObject.h
  • 您的班級有一個字符串作爲成員。所以你也需要<string>的頭文件
  • 你的類有一個指向BMF的指針。前向聲明就足夠了。刪除include可能會破壞某些代碼,這些代碼會包含在那裏,但是修復該代碼,而不是該文件。將#include "BMF.h"替換爲class BMF;
  • 您的類有一個指向SDL_Texture的指針。不僅如此,這個指針只出現在類的私有部分,根本不出現在公共接口中。 (與公共構造函數中出現的BMF指針以及類成員不同)。因此,在這裏更應該使用前向聲明。然後,您的課程的用戶不會得到包含的開銷。與class SDL_Texture;

更換"#include SDL.h"這是可以學到一些東西有用,可以幫助你在未來,以及在這種特殊情況下。

已經改變了你的頭,只用向前聲明,涉及到這些文件的編譯單元,即.cpp文件,現在必須包含頭。

+0

GameObject有這些包括的原因是因爲它有字符串變量也是一個紋理變量,後來我認爲這兩個變量是必要的,並刪除它們,但忘記刪除這些包括.. 我改變了除SDL.h以外的所有內容,因爲SDL.h是C庫,帶有我使用的函數,所以我無法訪問它們。 – Zaraka

+0

如果SDL_Texture是一個結構而不是一個類,那麼把結構放在你的轉發聲明中,但是仍然在你的頭文件中使用一個前向聲明。在您的編譯單元中,即您的.cpp文件中包含標題。 – CashCow

+0

但現在。我不能在GuiBitMapText.cpp文件中使用BMF類。當我嘗試使用一些類的方法。編譯器拋出「不完整類型的無效使用」類BMF'「 – Zaraka