Ошибка LNK2001: неразрешенный внешний символ "private: статический класс

ошибка LNK2001: неразрешенный внешний символ "private: static class irrklang:: ISoundEngine * GameEngine:: Sound:: _ soundDevice" (? _soundDevice @Sound @GameEngine @@0PAVISoundEngine @irrklang @@A)

Я не могу понять, почему я получаю эту ошибку. Я считаю, что я правильно инициализирую. Может кто-нибудь протянуть руку?

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;

Любая помощь будет принята с благодарностью

Ответ 1

Поместите это в sound.cpp:

irrklang::ISoundEngine* Sound::_soundDevice;

ПРИМЕЧАНИЕ. Вы также можете инициализировать его, например:

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

static, но члены данных не const должны быть определены вне определения класса и внутри пространства имен, охватывающего класс. Обычная практика заключается в том, чтобы определить ее в блоке трансляции (*.cpp), поскольку она рассматривается как деталь реализации. Одновременно (определение внутри класса) могут быть объявлены и определены только static и const интегральные типы:

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

в этом случае вам не нужно добавлять определение x, поскольку оно уже определено внутри определения класса. Однако в вашем случае это необходимо. Выдержка из раздела 9.4.2 стандарта С++:

Определение для статического члена данных должно появиться в области пространства имен, охватывающей определение класса членов.

Ответ 2

В конце концов, ответ, данный @Alexander, разрешил аналогичную проблему в моем собственном коде, но не без нескольких испытаний. В интересах следующего посетителя, когда он говорит "Положите это в sound.cpp", чтобы быть совершенно ясным, это в дополнение к тому, что уже присутствует в sound.h.