0

我正在整合我當前的遊戲引擎與irrKlang聲音引擎,並且正在處理持續性錯誤。簡化:爲什麼此代碼會生成編譯器錯誤C2227?

fsCore.h

class fsEngine 
{ 
public: 
    static fsEngine *getInstance(); 
    static void release(); 
    ; 
private: 
    static fsEngine *instance; 
    static fsBool exists; 
    irrklang::ISoundEngine *soundEngine; 
}; 

fsCore.cpp

#include "fsCore.h" 
void fsEngine::release() 
{ 
    exists = false; 
    delete instance; 
    soundEngine->drop(); //C2227 
}; 

發動機被正確申報,並如期單正在執行。有任何想法嗎?

+6

如果'釋放()'是靜態的,怎麼能訪問'soundEngine',這是一個*實例*會員? – 2013-05-02 17:37:24

+0

[Here](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)。 – 2013-05-02 17:41:30

回答

3

C2227的說明可以在這裏找到:Compiler Error C2227

當編譯器獲取到該行:

soundEngine->drop(); //C2227 

它會告訴你soundEngine必須指向類/結構/聯合,才能稱之爲drop()就可以了。這裏的實際問題是你試圖從靜態函數訪問非靜態數據成員。

還要注意的是delete不改變指針本身的價值,所以執行該行後:

delete instance; 

instance值仍設置爲同一個地址,這個指針已經成爲無效( dlingling)。這是分配NULL指針一個很好的做法後,你delete它:

delete instance; 
instance = NULL; 
+0

啊謝謝你。這是否意味着我無法從非靜態函數訪問靜態變量? LNK2001。 – Catsup 2013-05-02 18:25:07

+1

@Catsup:從非靜態成員函數訪問靜態成員是完全沒問題的。 – LihO 2013-05-02 18:37:22

+0

鏈接錯誤來自嘗試從創建文件外部訪問靜態變量。 – Catsup 2013-05-03 16:58:55

相關問題