单例类的定义和使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Singleton {
public:
static shared_ptr<Singleton>& instancePtr() {
static std::shared_ptr<Singleton> instance(new Singleton);
return instance;
}

static Singleton& instance() {
return *instancePtr();
}

Singleton(const Singleton&) = delete;

Singleton& operator=(const Singleton&) = delete;

virtual ~Singleton() = default;
protected:
Singleton() = default;

private:
int num{ 42 };
};

众所周知,C++中的单例模式可以在实例化函数中实例化一个静态的对象,然后返回静态对象的引用即可。不过由于C++还有智能指针的存在,只返回引用的话,无法满足使用智能指针的场景。
经过改进后,仍然是选择返回静态对象的方案,不过提供了两个实例化函数,分别返回智能指针和对象引用。有趣的是,在返回对象引用的实例化函数中,不再是实例化一个静态函数(否则两个实例化函数都被使用的情况下会出现两个实例对象,这与单例类的设计初衷相悖),而是返回智能指针实例化中的静态对象,这样就保证了全局只会有一个静态的实例化对象。

PS: 一定要将拷贝构造和拷贝赋值运算符重载都delete掉,否则在调用实例化对象的时候,不指定引用类型的话会拷贝一个新的对象,也没有错误提示。