我正在努力理解我得到的错误的含义。
这是一个单例实现:
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;
?还有为什么在删除该行时会出现链接错误?
答案 0 :(得分:2)
您必须初始化静态变量:
Singleton* Singleton::m_instance = 0;
我们只能在类上调用静态类成员,而不能在类的对象上调用。即使没有实例,这也是可能的。这就是为什么每个静态成员实例必须初始化的原因,通常是在cpp文件中。
由于静态变量在类范围之外初始化,我们必须通过全名调用变量(例如Singleton :: m_instance)。
答案 1 :(得分:0)
所以我不理解那条线的语法 - 为什么我不能只写Singleton :: m_instance = 0;?
这里的语法是static member的定义,需要在类定义之外定义。这就是为什么如果你删除它你将得到未定义的链接错误。
class X { static int n; }; // declaration (uses 'static') int X::n = 1; // definition (does not use 'static')
答案 2 :(得分:0)
这在C ++标准中指定
9.4.2静态数据成员
2在类定义中声明静态数据成员是 不是定义,可能是不完整的类型 cv合格的空白。静态数据成员的定义应 出现在包含成员类定义的命名空间范围内。 在命名空间范围的定义中,静态数据的名称 成员应使用::运算符通过其类名限定。该 静态数据成员定义中的初始化表达式 其类的范围
因此,类范围中的声明不被视为定义,这就是导致链接器错误的原因。