2013-04-17 55 views
13

錯誤LNK2001:無法解析的外部符號 「私人:靜態類irrklang :: ISoundEngine * GameEngine ::聲音:: _ soundDevice」(_soundDevice @聲音@ GameEngine @@ 0PAVISoundEngine @ irrklang @@ A)錯誤LNK2001:無法解析的外部符號「私人:靜態類

我想不通,爲什麼我收到這個錯誤。我相信我是正確初始化。任何人都可以伸出援助之手?

sound.h

class Sound 
{ 
private: 
    static irrklang::ISoundEngine* _soundDevice; 
public: 
    Sound(); 
    ~Sound(); 

    //getter and setter for _soundDevice 
    irrklang::ISoundEngine* getSoundDevice() { return _soundDevice; } 
// void setSoundDevice(irrklang::ISoundEngine* value) { _soundDevice = value; } 
    static bool initialise(); 
    static void shutdown(); 

sound.cpp

namespace GameEngine 
{ 
Sound::Sound() { } 
Sound::~Sound() { } 

bool Sound::initialise() 
{ 
    //initialise the sound engine 
    _soundDevice = irrklang::createIrrKlangDevice(); 

    if (!_soundDevice) 
    { 
     std::cerr << "Error creating sound device" << std::endl; 
     return false; 
    } 

} 

void Sound::shutdown() 
{ 
    _soundDevice->drop(); 
} 

,並在那裏我用聲音設備

GameEngine::Sound* sound = new GameEngine::Sound(); 

namespace GameEngine 
{ 
bool Game::initialise() 
{ 
    /// 
    /// non-related code removed 
    /// 

    //initialise the sound engine 
    if (!Sound::initialise()) 
     return false; 

任何幫助,將不勝感激

回答

40

將這個成sound.cpp

irrklang::ISoundEngine* Sound::_soundDevice; 

注意:您可能想要初始化它,以及,例如:

irrklang::ISoundEngine* Sound::_soundDevice = 0; 

static,但非const數據成員應的類定義之外並命名空間包圍類內部來限定。通常的做法是在翻譯單元(*.cpp)中定義它,因爲它被認爲是一個實現細節。只有staticconst整型可以聲明,並在同一時間定義(類定義):

class Example { 
public: 
    static const long x = 101; 
}; 

在這種情況下,你不需要補充,因爲它已經在類定義內定義x定義。但是,您的情況是必要的。從C++標準的節9.4.2中提取出來:

爲靜態數據成員應在命名空間範圍包圍構件的類定義出現的定義。

+0

完美!現在可以編譯並獲得預期的結果。非常感謝你。 – rkleman12

2

最終,@Alexander給出的答案在我自己的代碼中解決了類似的問題,但並非沒有幾次試驗。爲了下一位訪問者的利益,當他說「把它放到sound.cpp中」時,要清楚地說明,這是sound.h中已經存在的內容。

相關問題