单例模式如何用unique_ptr获取
时间: 2024-05-09 17:14:22 浏览: 20
单例模式的目的是确保一个类只有一个实例,并提供一个全局访问点。
使用unique_ptr获取单例对象时,需要满足以下两个条件:
1. 单例对象必须是堆上分配的,即使用new运算符分配内存。
2. 构造函数和析构函数必须是私有的,以确保只能通过单例类的静态成员函数获取单例对象。
以下是一个使用unique_ptr获取单例对象的示例代码:
```c++
class Singleton {
private:
Singleton() {} // 将构造函数设为私有,禁止外部创建对象
~Singleton() {} // 将析构函数设为私有,禁止外部销毁对象
public:
static Singleton* getInstance() {
static std::unique_ptr<Singleton> instance(new Singleton()); // 在静态函数中创建unique_ptr对象
return instance.get(); // 返回unique_ptr对象的指针
}
};
int main() {
Singleton* ptr1 = Singleton::getInstance();
Singleton* ptr2 = Singleton::getInstance();
std::cout << (ptr1 == ptr2 ? "Same instance." : "Different instances.") << std::endl; // 输出 "Same instance."
return 0;
}
```
在上述示例代码中,Singleton类的构造函数和析构函数都是私有的,外部无法创建和销毁对象。getInstance()函数是静态成员函数,用于获取单例对象的指针。在getInstance()函数中,使用static关键字定义unique_ptr对象instance,并将其初始化为指向Singleton对象的指针。由于unique_ptr对象是静态变量,因此它只会在第一次调用getInstance()函数时被创建。之后每次调用getInstance()函数时,都会返回unique_ptr对象的指针。因此,ptr1和ptr2的值应该相等,输出结果为"Same instance."。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)