【问题标题】:error LNK2001: unresolved external symbol "private: static class错误 LNK2001:未解析的外部符号“私有:静态类
【发布时间】:2013-04-17 00:09:02
【问题描述】:

错误 LNK2001:无法解析的外部符号“私有:静态类 irrklang::ISoundEngine * GameEngine::Sound::_soundDevice”(?_soundDevice@Sound@GameEngine@@0PAVISoundEngine@irrklang@@A)

我无法弄清楚为什么我会收到此错误。我相信我正在正确初始化。有人可以帮忙吗?

声音.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();

声音.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;

任何帮助将不胜感激

【问题讨论】:

    标签: c++ visual-c++ linker-errors static-members


    【解决方案1】:

    把这个放到sound.cpp:

    irrklang::ISoundEngine* Sound::_soundDevice;
    

    注意:您可能还想初始化它,例如:

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

    static,但非const 数据成员应在类定义之外和包含该类的命名空间内定义。通常的做法是在翻译单元(*.cpp)中定义它,因为它被认为是一个实现细节。只能同时声明和定义staticconst 整数类型(在类定义中):

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

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

    静态数据成员的定义应出现在包含该成员的类定义的命名空间范围内。

    【讨论】:

    • 完美!现在可以编译并获得预期的结果。非常感谢。
    • criss cest dla marde! :)
    【解决方案2】:

    最终,@Alexander 给出的答案在我自己的代码中解决了类似的问题,但并非没有经过几次试验。为了方便下一位访问者,当他说“将其放入 sound.cpp”时,要非常清楚,这是对 sound.h 中已经存在的内容的补充。

    【讨论】:

      【解决方案3】:

      我在堆栈数组定义方面遇到了同样的问题。所以,让我在这里简单解释一下。

      在头文件中:

      class MyClass
      {
      private:
          static int sNums[55]; // Stack array declaration
          static int* hNums;    // Heap array declaration
          static int num;       // Regular variable declaration
      }
      

      在 C++ 文件中

      int MyClass::sNums[55] = {};          // Stack array definition
      int MyClass::hNums[55] = new int[55]; // Heap array definition
      int MyClass::num = 5;                 // Regular variable Initialization
      

      【讨论】:

        猜你喜欢
        • 2015-12-31
        • 2015-05-01
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 2012-05-03
        • 2014-09-27
        相关资源
        最近更新 更多