2013-02-21 42 views
3

所以我有三個有關文件:結構將無法正常工作包含在頭文件時

MyGame.cpp  //Where all my codeing takes place 
MyDirectX.h  //Where I declare prototypes 
MyDirectX.cpp  //where I define functions/structs 

我有一個可愛的小結構,看起來像這樣:

struct Sprite 
{ 
LPDIRECT3DTEXTURE9 texture; 

int frame; 
int starttime; 

    Sprite() 
    { 
     texture = NULL; 
     texture = LoadTexture("explosion_30_128.tga"); 
     frame = 0; 
     starttime = 0; 
    } 
}; 

所以這裏的問題:

當我在MyGame.cpp中聲明它時,該結構工作得很好。但是,我在頭文件中需要它,因爲其他函數依賴於它(並且整潔)。我宣佈它在MyDirectX.h這樣:

struct Sprite; 

而且在MyDirectX.cpp定義它:

struct Sprite 
{...code...}; 

我可以在MyGame.cpp

Sprite explosion; 

創建一個全球性的雪碧和全部結帳。但是,當我嘗試爆炸框架=或爆炸框架=(或任何其他成員的事情),我得到的錯誤「表達式必須是一個指向完整的對象類型。」

如果我在MyDirectX.h中定義整個結構而不是MyDirectX.cpp,則會得到一個無法解析的外部符號。如果我在兩個定義中出現重新定義錯誤。

我一直在做測試和研究幾個小時,我只是無法弄清楚這一點。對我來說,爲什麼這個結構在MyGame.cpp中工作,但在我的頭文件中使用它時不起作用。我應該注意到,我已經在這些文件中聲明並定義了許多函數,並且它們都工作得很好。

任何幫助將不勝感激。 謝謝。

+0

您可以創建[SSCCE](http://sscce.org/)嗎? – 2013-02-21 20:02:18

+0

@Joachim Pileborg我想我可以想出一些東西。 – Wimp 2013-02-21 20:17:10

+0

「我可以在MyGame.cpp中創建一個全局的Sprite」不,你不能,而不是你所描述的設置:http://liveworkspace.org/code/28MHuK$1你必須使_definition_在你使用的地方可見該類型需要完整的類型。 – bames53 2013-02-21 20:23:46

回答

2

Sprite sprite;定義,而不是一個聲明。它試圖創建該對象。要申報班級,只需添加struct Sprite;

要擁有一個全局,您需要使用extern Sprite sprite,否則,將多個轉換單元包含該頭時會出現多重定義錯誤。

+0

Opps,這是我的問題中的一個類型,而不是我的代碼。我沒有將它聲明爲struct Sprite。 – Wimp 2013-02-21 20:14:33

3

你需要把struct的完整定義在一個頭,因此它可以通過任何代碼完整的類型進行訪問:

struct Sprite 
{ 
    LPDIRECT3DTEXTURE9 texture; 

    int frame; 
    int starttime; 

    Sprite(); 

}; 

你可以再放入實現代碼在一個單獨的文件.cpp。代碼並不需要完整的類型,你可以繼續使用預先聲明

struct Sprite; 
1

錯誤「表達必須是一個指向一個完整的對象類型。」意味着你只有轉發宣告了一個對象,但沒有提供一個定義,因此「不完整」。

正向聲明,即

struct Sprite; 

,您可以:
1)存儲/傳遞變量作爲雪碧*
2)存儲/傳遞變量作爲雪碧&

你不能做任何事情,即通話函數或訪問成員的雪碧。

做那些你需要的定義,這是

struct Sprite 
{ 
    LPDIRECT3DTEXTURE9 texture; 

    int frame; 
    int starttime; 

    Sprite(); 

}的東西;

因此,如果另一個.cpp文件使用Sprite,則必須將該定義放在標題中,並使用精靈將該標題包含在.cpp中。

+0

感謝您的幫助。我早些時候嘗試過,但看起來我很想念它隨附的錯誤。可能完全是另一個問題。但是爲了澄清,結構應該在相同的.h文件中聲明和定義,而不是像函數一樣分割成.h和.cpp文件。 – Wimp 2013-02-24 00:52:59

+1

通常,結構體不會分解爲.h/.cpp文件,因爲結構體通常沒有函數,或者如果它們的確如此,它們確實很短,只能放在結構體定義中。 – pauld 2013-02-25 16:01:58

+1

如果結構只用於一個cpp文件,那麼你可以在同一個cpp文件中定義結構。如果它在兩個或多個cpp文件中使用,則必須將結構定義放在一個頭文件中,並將其包含在cpp文件中。 – pauld 2013-02-25 16:03:51