c++ - 为什么单例实例必须在以下代码中初始化
问题描述
#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++ 中初始化静态成员的过程之外,将单例初始化为 null 的唯一原因是,由于某种原因(例如等待分配和/或初始化其他资源),您明确需要在应用程序的稍后阶段进行初始化)。否则,可以在静态声明期间对其进行初始化。此外,您不需要处理指针来创建单例。
class Singleton
{
public:
static Singleton & getInstance();
private:
Singleton(){}
static Singleton instance;
};
Singleton Singleton::instance;
Singleton & Singleton::getInstance()
{
return instance;
}
编辑:没关系,我看到你的问题是针对静态初始化过程而不是模式本身
推荐阅读
- r - 如何将excel类型文件转换为html类型文件?
- ios - iOS Firebase 令牌获取问题
- javascript - JS 是否有一种简单的方法来格式化输入类型,同时提示 1,000.00
- linux - 避免在 shell 脚本中使用单独的文件
- java - 如何访问多维数组中的特定索引?
- java - Jooq - 间隔 2 周
- java - 无法以我需要的格式将日期字符串转换为日期对象
- reactjs - 当我传递给 axios 发布请求时使用 setState 更新数据
- flutter - 我想传递一个小部件,它也在 Flutter 的 void 方法中传递一个字符串值
- python - 使用 python 子进程时抑制 shell 输出