单个对象的未解决的外部符号链接错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单个对象的未解决的外部符号链接错误相关的知识,希望对你有一定的参考价值。

我试图理解我得到的错误的含义。

这是一个单例实现:

class Singleton
{
    private:
        Singleton():m_value(0){};
        static Singleton * m_instance;
        int m_value;

    public:
        static Singleton * GetInstance()
            {
                if(!m_instance)
                {
                    m_instance = new Singleton;
                }

                return m_instance;
            }
        void SetValue(int x){m_value = x;}
        int GetValue(){return m_value;}

        ~Singleton()
        {
            if(m_instance)
                delete m_instance;
        }
    };



Singleton* Singleton::m_instance = 0;


void main()
{
    Singleton * s1 = Singleton::GetInstance();
}

代码编译并成功运行。

当我删除行Singleton* Singleton::m_instance = 0;时,我收到错误:

 error LNK2001: unresolved external symbol "private: static class Singleton * Singleton::m_instance"

我想这一行的意思是将静态变量m_instance设置为0。

所以我不明白那条线的语法 - 为什么我不能只写Singleton::m_instance = 0;?还有为什么在删除该行时会出现链接错误?

答案

您必须初始化静态变量:

Singleton* Singleton::m_instance = 0;

我们只能在类上调用静态类成员,而不能在类的对象上调用。即使没有实例,这也是可能的。这就是每个静态成员实例必须初始化的原因,通常是在cpp文件中。

并且由于静态变量在类范围之外初始化,我们必须通过全名调用变量(例如Singleton :: m_instance)。

另一答案

所以我不理解那条线的语法 - 为什么我不能只写Singleton :: m_instance = 0;?

这里的语法是static member的定义,需要在类定义之外定义。这就是为什么如果你删除它会得到未定义的链接错误。

class X { static int n; }; // declaration (uses 'static')
int X::n = 1;              // definition (does not use 'static')
另一答案

这是在C ++标准中指定的

9.4.2静态数据成员

2在类定义中声明静态数据成员不是定义,除了cv-qualified void之外,它可能是不完整的类型。静态数据成员的定义应出现在包含成员类定义的命名空间范围内。在命名空间作用域的定义中,静态数据成员的名称应使用::运算符通过其类名限定。静态数据成员定义中的初始化表达式在其类的范围内

因此,类范围中的声明不被视为定义,这就是您获取链接器错误的原因。

以上是关于单个对象的未解决的外部符号链接错误的主要内容,如果未能解决你的问题,请参考以下文章

与 VS2017 和 FFMPEG 4 完全矛盾的未解决的外部符号 + 未使用的库

C++:错误 LNK2019:函数 _main 中引用的未解析的外部符号

Apple Mach-O 链接器错误/架构 i386 的未定义符号:

XCode 5 - 架构 armv7 的未定义符号:

IAudioClient::Initialize 方法的未解析外部符号。 WASAPI API

C ++链接错误未解决的外部符号