c++ - 类中的静态对象(单例)
问题描述
我正在研究单例设计模式的两种实现。
我想知道第二个是如何工作的,特别是:
为什么作者选择返回 DB 作为参考。
为什么 getDatabaseConnection() 中的静态类对象 DB 不需要在 SingleDatabase 类之外定义,如下所示:
SingletonDatabase& SingletonDatabase::DB;
- 像静态变量一样,静态类对象是否只创建一次(并且在同一类的所有对象之间共享)?
执行
class SingletonDatabase {
private:
SingletonDatabase() {
std::cout << "Initializing database" << std::endl;
instanceCount++; // Used in testing later on.
}
public:
SingletonDatabase(const SingletonDatabase&) = delete;
SingletonDatabase& operator=(const SingletonDatabase&) = delete;
static SingletonDatabase& getDatabaseConnection() {
static SingletonDatabase DB;
return DB;
}
static int instanceCount;
};
int SingletonDatabase::instanceCount = 0;
我习惯于看到使用静态指针的实现,作者提到它不是线程安全的。他更喜欢这种方法。
谢谢!
解决方案
- 为什么作者选择返回 DB 作为参考。
除了引用之外,还可以使用指针。该参考更好地表达了被指点对象被授予存在。(按值返回反而会破坏这个概念。)
- 为什么 getDatabaseConnection() 中的静态类对象 DB 不需要在 SingleDatabase 类之外定义,如下所示:
SingletonDatabase& SingletonDatabase::DB;
它不是一个成员变量,而是一个static
具有局部范围的变量,而是一个静态的生命周期 → 被授予从第一次访问到进程结束的存在。
SO:C++ 函数中静态变量的生命周期是多少?(有点陈旧但仍然正确)
这将在普通函数中以相同的方式工作。周围函数是(static
成员函数)与此无关。
- 像静态变量一样,静态类对象是否只创建一次(并且在同一类的所有对象之间共享)?
是的。
正确地说,它在此函数的任何调用者之间共享。
顺便提一句。这被称为Meyers Singleton:
推荐阅读
- ios - 从 iOS 设备打开应用程序时通知
- tableau-api - 无原始数据源 Tableau twbx
- ios - 如何快速在饼图图层上方绘制文本
- javascript - 如何在 Angular 6 中捕获第三方库中的数据?
- asp.net-mvc - 在 asp .net mvc 中集成 angular 6 的最佳方法是什么?
- c# - 在 Xamarin.Forms 中的每个页面上执行相同的功能
- kubernetes - 在 Kubernetes 中运行服务的配置文件不能正常工作
- php - PHP 7.1 无法识别 PHP5.6+ 语法“使用函数”
- wpf - 页面正在 WPF 选项卡式文档界面中重新加载
- windows - BCRYPT_XTS_AES_ALGORITHM CNG 算法在 BCryptGenerateSymmetricKey API 中失败