C++ 单例对象的未解析外部符号链接错误

C++ 单例对象的未解析外部符号链接错误,c++,singleton,linker-errors,C++,Singleton,Linker Errors,我试图理解我所犯错误的意义 这是一个单例实现: class Singleton { private: Singleton():m_value(0){}; static Singleton * m_instance; int m_value; public: static Singleton * GetInstance() { if(!m_instance)

我试图理解我所犯错误的意义

这是一个单例实现:

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::m_instance=0

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


您必须初始化静态变量:

Singleton* Singleton::m_instance = 0;
我们只能在类上调用静态类成员,而不能在类的对象上调用。这是可能的,即使不存在实例。这就是为什么每个静态成员实例都必须初始化,通常在cpp文件中


由于静态变量在类作用域之外初始化,所以我们必须用全名调用变量(例如:SUNLITON::MYUnLISH)。

< P>这是C++标准

中指定的。 9.4.2静态数据成员

2静态数据成员在其类定义中的声明为 不是定义,可能是不完整的类型,而不是 cv合格无效。静态数据成员的定义应 出现在包含成员类定义的命名空间范围中。 在命名空间范围的定义中,静态数据的名称 成员应使用::运算符通过其类名进行限定。这个 静态数据成员定义中的初始值设定项表达式位于 其类别的范围

因此,类作用域中的声明不被视为定义,这就是为什么会出现链接器错误。

更好的惯用方法:
Singleton* Singleton::m_instance = 0;