2013-04-17 15 views
13

errore LNK2001: simbolo esterno "privato:? Classe irrklang statica :: ISoundEngine * GameEngine :: :: suono _ soundDevice"(_soundDevice @ Suono @ GameEngine @@ 0PAVISoundEngine @ irrklang @@ a)errore LNK2001: simbolo esterno "privato: classe statica

io non riesco a capire il motivo per cui sto ricevendo questo errore. credo che sto inizializzazione correttamente. qualcuno può dare una mano?

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

e dove io uso il dispositivo audio

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

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

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

Qualsiasi aiuto sarebbe molto apprezzato

risposta

40

mettere questo in sound.cpp:

irrklang::ISoundEngine* Sound::_soundDevice; 

NOTA : Si potrebbe voler inizializzare come pure, per esempio:

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

static, ma non const membri di dati deve essere definita al di fuori della definizione della classe e dentro lo spazio racchiudente la classe. La prassi usuale è di definirla nell'unità di traduzione (*.cpp) perché è considerata un dettaglio di implementazione. Solo static e const tipi integrali possono essere dichiarati e definiti allo stesso tempo (all'interno definizione di classe):

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

in questo caso non è necessario aggiungere x definizione, perché è già stato definito all'interno della definizione di classe. Tuttavia, nel tuo caso è necessario. Estratto dal sezione 9.4.2 del C++ standard:

La definizione di un membro di dati statici devono apparire in un ambito spazio dei nomi che racchiude definizione della classe del membro.

+0

Perfetto! ora può compilare e ottenere il risultato previsto. Grazie mille. – rkleman12

2

Alla fine, la risposta fornita da @Alexander ha risolto un problema simile nel mio codice, ma non senza alcune prove. Per il beneficio del prossimo visitatore, quando dice "Metti questo in sound.cpp", per essere perfettamente chiaro, questo è in aggiunta a ciò che è già presente in sound.h.

Problemi correlati