为什么单例实例必须在以下代码中初始化

时间:2019-01-21 07:42:05

标签: c++ c++11

#include <iostream>

using namespace std;

class Singleton
{
public:
    static Singleton *getInstance(); 

private:
    Singleton(){}
    static Singleton* instance;
};

Singleton* Singleton::instance = 0;
Singleton* Singleton::getInstance() 
{
    if(!instance) {
        instance = new Singleton();
        cout << "getInstance(): First instance\n";
        return instance;
    }
    else {
        cout << "getInstance(): previous instance\n";
        return instance;
    }
}

int main()
{
    Singleton *s1 = Singleton::getInstance();
    Singleton *s2 = Singleton::getInstance();
    return 0;
}

我不明白为什么下一行中的单例实例变量应该用0初始化。 Singleton * Singleton :: instance = 0; 因为当我忘记初始化实例时,我得到了

错误
singleton.cpp:(.text+0xc): undefined reference to `Singleton::instance'
singleton.cpp:(.text+0x2d): undefined reference to `Singleton::instance'
singleton.cpp:(.text+0x43): undefined reference to `Singleton::instance'
singleton.cpp:(.text+0x5b): undefined reference to `Singleton::instance'
collect2: error: ld returned 1 exit status

2 个答案:

答案 0 :(得分:1)

Singleton* Singleton::instance = 0;` 是声明,而不是定义。

按照[class.static.data]/2

  

在其类定义中声明的非嵌入式静态数据成员不是定义...

因此,没有下面的代码行,

instance
在代码中未定义

getInstance。并且尝试在android:textStyle="bold|italic"中使用它会导致未定义的引用错误。

答案 1 :(得分:0)

除了在C ++中初始化静态成员的过程之外,将单例初始化为null的唯一原因是因为出于某种原因(例如,等待分配其他资源和/或已初始化)。否则,可以在静态声明期间将其初始化。此外,您无需处理指针即可创建Singleton。

class Singleton
{
public:
    static Singleton & getInstance(); 

private:
    Singleton(){}
    static Singleton instance;
};

Singleton Singleton::instance;
Singleton & Singleton::getInstance() 
{
   return instance;
}

编辑:没关系,我看到您的问题是针对静态初始化过程而不是模式本身