2014-01-25 181 views
0

我在SDL2中創建了一個簡單的遊戲並學習了C++類,但是我在使用私有變量和類構造函數時遇到了困難。我試圖訪問定義爲私有變量的SDL_Texture,並在構造函數中對其進行修改。無法從構造函數訪問私有變量 - 不在範圍內(C++)

在彙編下面的代碼將導致以下錯誤:

In constructor 'PlayerShip::PlayerShip(SDL_Texture*)': |5| error: 'ShipSprite' was not declared in this scope

頭文件(PlayerShip.h):

#ifndef PLAYERSHIP_H 
#define PLAYERSHIP_H 

#include "SDL2/SDL.h" 

class PlayerShip 
{ 
    public: 
     PlayerShip(SDL_Texture * tex); 
    private: 
     SDL_Texture * ShipSprite = nullptr; //The variable/texture I want to modify 
}; 
#endif 

CPP文件(PlayerShip.cpp)

#include "PlayerShip.h" 

PlayerShip::PlayerShip(SDL_Texture * tex) //ctor 
{ 
    ShipSprite = tex; //This needs to change the private variable above. However "ShipSprite" is apparently not in scope. 
} 

它是在頭文件中定義的,但我不確定它爲什麼會贏得'即使它在課堂內部也可以訪問它。我試着尋找解決這個問題的方法,但是我發現的問題與我的問題沒有關係。

在此之上,我試圖改變ShipSprite = tex;以下內容,但沒有成功: PlayerShip::ShipSprite = tex;this->ShipSprite = tex;

的任何想法,將不勝感激。謝謝。

+1

編譯器給你帶來的* only *錯誤嗎? –

+0

這聽起來像你可能有多個文件名爲'PlayerShip.h' –

+0

@BenVoigt是的,這是我得到的唯一錯誤,我檢查了重複的文件,找不到任何。 – iownall555

回答

0

見,如果你不定義包括後衛(#ifndef PLAYERSHIP_H)其他地方。

此外,檢查minGW的輸出,它使用哪個文件,也許你的假設是錯誤的?你也可以做快速和骯髒的調試,比如在你的頭文件中引入一個語法錯誤。如果它未被捕獲,則甚至不使用該文件。

除此之外,我建議一些其他的東西(無關你的問題):

  • 有成員變量的命名約定是從類名稱的不同。 ShipSprite可能是shipSprite_,m_shipSprite,shipSprite或你有什麼。 (一套好的建議:http://geosoft.no/development/cppstyle.html

  • 如果你想初始化成員變量,那麼首先要用構造函數初始化列表來完成。編號: PlayerShip::PlayerShip(SDL_Texture * tex) : ShipSprite(tex) { }如果您對自己想要做的更精確,編譯器可能會更有幫助。

1

取決於編譯器的最新版本,它可能不接受不具有整數類型的非靜態成員的初始化。或者它可能不知道關鍵字nullptr

SDL_Texture * ShipSprite = nullptr; 

嘗試,而不是

SDL_Texture * ShipSprite; 
+0

它似乎沒有工作。我仍然遇到同樣的錯誤。至於我的編譯器,我使用MinGW和GCC 4.8.2,並且我設置了C++ 11標誌。 – iownall555

-1

這樣看來,我可能不小心單獨編譯頭文件之前,我增加了變量,它在同一文件夾中我的頭部留下了PlayerShip.gch文件。海灣合作委員會可能試圖使用它而不是正常的頭文件,因此給了我那個錯誤。

儘管如此刪除。gch文件似乎已經解決了我的問題,現在程序編譯正確。不知道我是如何完全錯過的。

再次感謝大家的建議和幫助。

編輯:我該如何去關閉這個?

+0

似乎你的假設對於minGW使用哪些文件是錯誤的,而且它會通過建議的「在頭文件中引入語法錯誤」來確認這一點,更不用說「檢查minGW的輸出了,它使用哪個文件」。他們都似乎符合我上面提供的答案。您可以將您發現的解決方案描述爲對我的答案的評論,並接受它。或者,你可以接受你自己的答案。 PS:如果你的編譯系統不能自動更新預編譯頭文件,那麼你應該儘快修復這個問題,因爲它會給你帶來很多麻煩。 – swalog