2011-01-13 62 views
0

我在一個有幾個班的項目中工作。所有頭文件都包含在「包含」文件夾中,並且所有src文件都位於另一個文件夾中。但是,在這一點上,一直沒有問題的班級缺失。錯誤C2143。爲什麼VC++找不到我的課程?

產生錯誤的代碼是:

namespace render{ 
    class CSprite2D 
    { 
     CTexture * m_texture; 

和誤差是語法錯誤:缺少 ';'之前'*' 所以我不知道爲什麼VC++找不到我的課程。至於VC++編譯類的順序非常不一樣:在嘗試編譯Texture.cpp之前檢測sprite2D中的錯誤。此外,CTexture類已經進入該項目,並在創建sprite2D之前完美運行。

你能幫助我找到一些竅門嗎?

* 編輯: *它的工作原理,解決方案是簡單地轉發聲明紋理類(感謝詹姆斯和peenut)。但是現在我的疑問是:如果我已經包含紋理,爲什麼我需要轉發聲明紋理類?包含頭文件是不夠的?

在此先感謝。

+0

順序應該沒關係,你是否包含該代碼之前的頭文件? – GManNickG 2011-01-13 23:09:53

+1

你有沒有在你需要他們的地方包括正確的標題?你有問題遞歸包括對方的標題? – 2011-01-13 23:10:15

回答

2

只是聲明它,你只使用指針:

namespace render{ 
    class CTexture; //forward declaration 
    class CSprite2D 
    { 
     CTexture * m_texture; 

當然,作爲註釋suggets:

  • 不要忘了,包括你的* .cpp文件所有必要的頭
  • 使用前向聲明到分手循環依賴(例如類A {b * b;};類b {A * A;})

編輯:提問者編輯:

我已經包含了紋理,爲什麼我需要轉發聲明紋理類?

想象一下你有「sprite.hpp」,「texture.hpp」,並且CSprite2D包含指向紋理的指針。沒有前向聲明,在包含「sprite.hpp」之前,必須包含「texture.hpp」。更糟糕的是,如果你的CTexture使用CSprite2D指針,你別無選擇,只能使用前向聲明來避免循環依賴。

1

如果代碼位於不包括任何最終包含CTexture定義的頭文件,它不會知道什麼是CTexture是即使其他地方做。

但是,由於您僅在此處使用指針,因此您可能只需執行前向聲明並將頭文件包含在.cpp文件中,其中使用CTexture的方法/數據以避免循環頭文件包含。

相關問題