开场
前段时间我在知乎回答了这样一个问题:
为什么C++单例模式不能直接全部使用 static变量和 static函数呢?如果全部使用 static的话,是不是也不会有多线程的问题了?而且“类型::方法”的访问方式比起先getInstance()再访问难道不是更加简单清晰吗? (还是说是为了附和 “单例” 这样一个字面上的意思)
//大概这个样子
class Singleton {
public:
static void on() {Singleton::isOn = true;}
static void off() {Singleton::isOn = false;}
static bool state() {return Singleton::isOn;}
private:
static bool isOn;
};
这可能是很多C++学习者都会有的疑惑,下面是我的回答。
正文
通过getInstance()
函数获取单例对象,这种模式的关键之处不是在于强迫你用函数来获取对象。关键之处是让static对象定义在函数内部,变成局部static变量。看下这种实现方式的经典demo:
class Singleton {
public:
static Singleton& getInstance() {
static Singleton inst;
return inst;
}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
// 其他数据函数
// ...
private:
Singleton() { ... }
// 其他数据成员
// ...
};
学名是:Meyers' Singleton
。没错,也就是说这是Scott Meyers
最早提出来的C++单例模式的推荐写法。
《Effective C++》系列丛书作者
原文地址:https://cloud.tencent.com/developer/article/1965257
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。