c – error LNK2001:未解析的外部符号“private:static class

error LNK2001: unresolved external symbol “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;

任何帮助将不胜感激

解决方法

把它放到sound.cpp中:
irrklang::ISoundEngine* Sound::_soundDevice;

注意:您可能也希望初始化它,例如:

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

静态,但非const数据成员应定义在类定义之外,并且在包围类的命名空间内部.通常的做法是在翻译单元(* .cpp)中定义它,因为它被认为是一个实现细节.只有静态和常量整数类型可以同时声明和定义(在类定义中):

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

在这种情况下,您不需要添加x定义,因为它已经在类定义中定义.但是,在你的情况下,这是必要的.摘自C标准第9.4.2节:

The deFinition for a static data member shall appear in a namespace scope enclosing the member’s class deFinition.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...