【问题标题】:why singleton instance has to intialize in following code [duplicate]为什么单例实例必须在以下代码中初始化[重复]
【发布时间】:2019-06-14 13:42:54
【问题描述】:
#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

【问题讨论】:

  • 因为这是 C++ 的规则。 static Singleton* instance; 是一个声明,但变量也必须定义,Singleton* Singleton::instance = 0; 是一个定义。

标签: c++ c++11


【解决方案1】:

static Singleton* instance; 是声明而非定义。

根据[class.static.data]/2

在其类定义中声明非内联静态数据成员不是定义...

所以没有下面这行代码,

Singleton* Singleton::instance = 0;`   

instance 未在代码中定义。并且尝试在getInstance 中使用它会导致未定义的引用错误。

【讨论】:

    【解决方案2】:

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

    class Singleton
    {
    public:
        static Singleton & getInstance(); 
    
    private:
        Singleton(){}
        static Singleton instance;
    };
    
    Singleton Singleton::instance;
    Singleton & Singleton::getInstance() 
    {
       return instance;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-06
      • 1970-01-01
      • 2021-09-14
      • 2021-09-24
      • 2021-10-11
      • 2021-08-27
      • 2022-01-25
      相关资源
      最近更新 更多