C++ 饿汉式 单例模式
时间: 2024-11-18 16:14:11 浏览: 8
饿汉式单例模式是一种常见的软件设计模式,它保证了在程序运行初期就初始化并创建唯一的实例。在 C++ 中,这种实现方式通常通过静态成员变量和构造函数完成。以下是饿汉式单例的一个简单示例:
```cpp
class Singleton {
public:
// 构造函数是 private 的,防止外部直接创建对象
Singleton() {} // 这里是“饿汉”做法,即在编译时就创建了唯一实例
// 获取唯一实例的方法
static Singleton& getInstance() {
static Singleton instance; // 使用静态局部变量存储实例
return instance;
}
private:
// 防止通过拷贝构造函数或赋值操作符复制对象
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
```
在这个例子中,Singleton 类只有一个实例,并且该实例是在第一次调用 `getInstance()` 时创建的。这种方式的优点是线程安全,因为静态成员在编译时就已经完全初始化。
相关问题
c++绘制饿汉式单例模式
C++中的饿汉式单例模式是一种常见的设计模式,用于保证一个类只能有一个实例,并提供全局访问点。
下面是一个示例代码,演示了如何实现饿汉式单例模式:
```c++
#include <iostream>
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
void doSomething() {
std::cout << "Singleton is doing something" << std::endl;
}
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
int main() {
Singleton& instance = Singleton::getInstance();
instance.doSomething();
// error: 'Singleton::Singleton(const Singleton&)' is private
// Singleton anotherInstance(instance);
return 0;
}
```
在这个示例中,我们定义了一个Singleton类,并将其构造函数、拷贝构造函数和赋值操作符设置为私有,以防止外部创建实例或复制实例。getInstance方法返回一个静态局部变量,保证了只会创建一个实例,并提供了全局访问点。
相关问题:
1. 什么是单例模式?
2. 饿汉式和懒汉式单例模式有什么区别?
3. 什么是静态局部变量?
4. 如何防止外部复制单例对象?
用C++写出懒汉式单例模式和饿汉式单例模式的例子
以下是C++中懒汉式单例模式和饿汉式单例模式的例子:
1. 饿汉式单例模式
```cpp
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有构造函数
public:
static Singleton* getInstance() {
return instance;
}
};
Singleton* Singleton::instance = new Singleton(); // 在类外初始化静态成员变量
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
if (s1 == s2) {
cout << "s1和s2是同一个实例" << endl;
}
return 0;
}
```
2. 懒汉式单例模式
2.1 简易版
```cpp
class Singleton {
private:
static Singleton* instance;
Singleton() {} // 私有构造函数
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr; // 在类外初始化静态成员变量
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance(); if (s1 == s2) {
cout << "s1和s2是同一个实例" << endl;
}
return 0;
}
```
2.2 私有嵌套类-回收专用
```cpp
class Singleton {
private:
Singleton() {} // 私有构造函数
~Singleton() {} // 私有析构函数
static Singleton* instance;
class GarbageCollector { // 私有嵌套类
public:
~GarbageCollector() {
if (Singleton::instance != nullptr) {
delete Singleton::instance;
Singleton::instance = nullptr; }
}
};
static GarbageCollector gc; // 静态成员变量,程序结束时自动调用析构函数
public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};
Singleton* Singleton::instance = nullptr; // 在类外初始化静态成员变量
Singleton::GarbageCollector Singleton::gc; // 在类外初始化静态成员变量
int main() {
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
if (s1 == s2) {
cout << "s1和s2是同一个实例" << endl;
}
return 0;
}
```
阅读全文