错误 LNK2001:未解析的外部符号"私有:静态类

error LNK2001: unresolved external symbol "private: static class

本文关键字:符号 私有 外部 静态类 LNK2001 错误      更新时间:2023-10-16

错误LNK2001:未解析的外部符号"private:static class irrklang::ISoundEngine*游戏引擎::声音::_soundDevice"(?_soundDevice@Sound@游戏引擎@@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();

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

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

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

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

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

最终,@Alexander给出的答案解决了我自己代码中的一个类似问题,但并非没有经过几次尝试。为了下一个访问者的利益,当他说"把这个放到sound.cpp中"时,为了完全清楚,这是对sound.h中已经存在的内容的补充。

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

在头文件中:

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

如果可以使用C++17,则可以声明inline static数据成员:

private:
inline static irrklang::ISoundEngine* _soundDevice;