web-dev-qa-db-ja.com

エラーLNK2001:未解決の外部シンボル「プライベート:静的クラス

エラー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;

どんな助けでも大歓迎です

16
Robbie

これを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定義はクラス定義内ですでに定義されているため、追加する必要はありません。ただし、あなたの場合は必要です。 C++標準のセクション9.4.2からの抜粋

静的データメンバーの定義は、メンバーのクラス定義を囲む名前空間スコープに表示されます。

45

最終的に、@ Alexanderの回答により、自分のコードで同様の問題が解決しましたが、いくつかの試行が必要でした。次の訪問者のために、「これをsound.cppに入れる」と完全に明確に言うと、これはすでにsound.hにあるものに追加されます。

2
David A. Gray