首页 > 解决方案 > 为什么单例实例必须在以下代码中初始化

问题描述

#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++c++11

解决方案


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

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

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

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

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


推荐阅读