web-dev-qa-db-fra.com

erreur LNK2001: symbole externe non résolu "privé: classe statique

erreur LNK2001: symbole externe non résolu "privé: classe statique irrklang :: ISoundEngine * GameEngine :: Sound :: _ soundDevice" (? _soundDevice @ Sound @ GameEngine @@ 0PAVISoundEngine @ irrklang @@ A))

Je ne peux pas comprendre pourquoi je reçois cette erreur. Je crois que j'initialise correctement. Est-ce que quelqu'un peut me donner un coup de main?

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

et où j'utilise l'appareil 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;

Toute aide serait grandement appréciée

16
Robbie

Mettez ceci dans sound.cpp:

irrklang::ISoundEngine* Sound::_soundDevice;

REMARQUE: Vous pouvez également l'initialiser, par exemple:

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

static, mais les membres de données non - const doivent être définis en dehors de la définition de classe et à l'intérieur de l'espace de noms entourant la classe. La pratique habituelle consiste à le définir dans l'unité de traduction (*.cpp) car il est considéré comme un détail d'implémentation. Seuls les types intégraux static et const peuvent être déclarés et définis en même temps (dans la définition de classe):

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

dans ce cas, vous n'avez pas besoin d'ajouter la définition x car elle est déjà définie dans la définition de classe. Cependant, dans votre cas, c'est nécessaire. Extrait de section 9.4.2 de la norme C++:

La définition d'un membre de données statiques doit apparaître dans une étendue d'espace de noms contenant la définition de classe du membre.

45
Alexander Shukaev

Finalement, la réponse donnée par @Alexander a résolu un problème similaire dans mon propre code, mais pas sans quelques essais. Pour le bénéfice du prochain visiteur, quand il dit "Mettez ceci dans sound.cpp", pour être parfaitement clair, c'est en plus de ce qui est déjà présent dans sound.h.

2
David A. Gray