实现一个懒汉单例模式CPP
时间: 2023-11-28 15:58:45 浏览: 72
懒汉单例模式是指在第一次使用时才会创建单例对象,以下是一个简单的懒汉单例模式的实现:
```cpp
class Singleton {
private:
static Singleton* instance; // 私有静态成员变量,指向单例对象
Singleton() {} // 构造函数私有化,防止外部创建对象
public:
static Singleton* getInstance() {
if (instance == nullptr) { // 如果还没有创建单例对象
instance = new Singleton(); // 创建一个新的单例对象
}
return instance; // 返回单例对象指针
}
};
Singleton* Singleton::instance = nullptr; // 初始化静态成员变量
// 使用方法
Singleton* obj = Singleton::getInstance();
```
在上面的代码中,我们使用了一个静态成员变量 `instance` 来存储单例对象的指针。在 `getInstance()` 方法中,如果 `instance` 指针为空,则创建一个新的单例对象并将其赋值给 `instance`,最后返回单例对象指针。由于构造函数被私有化了,外部无法直接创建对象,因此只能通过 `getInstance()` 方法来获取单例对象。
相关问题
懒汉单例模式 c++
在C++中,懒汉式单例模式(也称为非初始化式单例模式)的特点是在首次请求时才创建单例实例。这样可以避免在类加载时就创建实例可能导致的资源浪费。以下是一个简单的懒汉式单例模式示例:
```cpp
// 定义一个单例类
class Singleton {
private:
// 私有构造函数防止外部直接实例化
Singleton() {}
public:
// 获取唯一实例的方法
static Singleton& getInstance() {
// 使用双重检查锁定以确保线程安全
static Singleton instance;
std::call_once(&Singleton::initInstance, []{}); // 只执行一次初始化
return instance;
}
// 初始化函数,只在getInstance初次调用时执行
static void initInstance() {}
// 公共接口方法
void publicMethod() {
// ...
}
};
// 示例使用
int main() {
Singleton& s = Singleton::getInstance();
s.publicMethod();
return 0;
}
```
在这个例子中,`getInstance()`方法使用了`std::call_once`确保初始化操作仅执行一次,从而实现了线程安全。当首次调用时,如果实例还未创建,则会执行`initInstance`方法并创建实例;后续调用则可以直接返回已存在的实例。
使用 C++11 std::call_once 实现的懒汉单例使用 C++11 std::call_once 实现的懒汉单例,C++11 线程安全。
在 C++11 中,`std::call_once` 函数是一个线程安全的宏,它用于确保一个初始化函数只被执行一次。这对于实现懒汉式(Lazy Singleton)设计模式非常有用,即延迟创建单例对象直到第一次被请求。
懒汉单例的基本思想是在首次访问时动态地创建并返回唯一的实例,避免了全局变量带来的潜在风险,并且可以控制单例的生命周期。以下是使用 `std::call_once` 实现懒汉单例的一个示例:
```cpp
#include <mutex>
#include <memory>
class Singleton {
private:
static std::once_flag flag;
static std::shared_ptr<Singleton> instance;
protected:
Singleton() = default; // 防止通过构造函数直接创建实例
public:
static std::shared_ptr<Singleton>& getInstance() {
std::call_once(flag, [] {
if (!instance) {
instance = std::make_shared<Singleton>();
}
});
return instance;
}
// 其他成员函数...
};
std::once_flag Singleton::flag;
std::shared_ptr<Singleton> Singleton::instance = nullptr;
```
在这个例子中,`getInstance()` 函数会保证在第一次被调用时,`instance` 被正确初始化。如果之后再次调用,`call_once` 将不会执行内部的初始化代码,因为已经完成了一次。
阅读全文