2013-04-17 18 views
13

błąd LNK2001: nierozwiązanych zewnętrznych symbolu "private: static class irrklang :: ISoundEngine * GameEngine :: Dźwięk :: _ soundDevice"(_soundDevice @ Dźwięk @ GameEngine @@ 0PAVISoundEngine @ irrklang @@)błąd LNK2001: nierozwiązanych zewnętrznych symbolu „private: klasa statyczna

nie mogę zrozumieć, dlaczego ja otrzymuję ten błąd. wierzę, że jestem inicjalizacji prawidłowo. Czy ktoś może podać rękę?

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(); 
} 

i gdzie mogę korzystać z urządzenia dźwiękowego

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

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

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

Każda pomoc będzie mile widziana

Odpowiedz

40

Włóż to do sound.cpp:

irrklang::ISoundEngine* Sound::_soundDevice; 

UWAGA : Może chcesz zainicjować jak to dobrze, na przykład:

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

static, ale nie- const członkowie danych powinny być zdefiniowana poza definicją klasy i wewnątrz przestrzeni nazw zamykającego klasę. Typową praktyką jest zdefiniowanie go w jednostce tłumaczeniowej (*.cpp), ponieważ jest uważany za szczegół implementacji. Tylko static i const integralne typy mogą być zadeklarowane i zdefiniowany w tym samym czasie (wewnątrz definicji klasy):

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

w tym przypadku nie ma potrzeby, aby dodać x definicję, ponieważ jest już zdefiniowana wewnątrz definicji klasy. Jednak w twoim przypadku jest to konieczne. Wyciąg z sekcji 9.4.2 standardu C++:

definicji dla statycznego członka danych powinny znajdować się w zakresie definicji klasy otaczającej przestrzeni nazw o członku.

+0

Idealny! może teraz skompilować i uzyskać oczekiwany wynik. Dziękuję Ci bardzo. – rkleman12

2

Ostatecznie odpowiedź udzielona przez @Alexander rozwiązała podobny problem w moim własnym kodzie, ale nie bez kilku prób. Dla dobra kolejnego użytkownika, gdy mówi "Włącz to do sound.cpp", aby było całkowicie jasne, jest to dodatek do tego, co jest już obecne w sound.h.

Powiązane problemy