c++ 单例例子
时间: 2023-07-01 17:12:54 浏览: 100
以下是一个简单的 C++ 单例类的例子,同样实现了一个线程安全的懒加载方式:
```c++
class Singleton {
public:
static Singleton& getInstance() {
static Singleton instance;
return instance;
}
private:
Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
};
```
在这个例子中,构造函数被声明为私有,确保该类不能被直接实例化。getInstance() 方法返回一个静态局部变量 instance 的引用,确保只有一个实例被创建,并且该实例是在需要时才被初始化的。同时,拷贝构造函数和赋值运算符被删除,防止该类被复制。这种实现方式是 C++11 中的线程安全懒加载实现方式,可以保证在多线程环境下正确创建实例。
相关问题
介绍一下C++ 单例模式
C++ 单例模式是一种常用的设计模式,它的主要目的是确保一个类只有一个实例,并提供全局访问该实例的方法。它通常被用来管理全局资源,例如日志记录器、配置文件、数据库连接等。
实现单例模式的关键在于确保类只有一个实例,并提供全局访问该实例的方法。在 C++ 中,可以通过静态成员变量和静态成员函数来实现这一点。
例如,下面是一个简单的 C++ 单例模式的实现:
```cpp
class Singleton {
private:
static Singleton* instance; // 静态成员变量,用于保存单例实例
Singleton() {} // 构造函数私有化,保证外部无法直接创建实例
public:
static Singleton* getInstance() { // 静态成员函数,用于获取单例实例
if (instance == nullptr) {
instance = new Singleton(); // 如果实例不存在,就创建一个新的实例
}
return instance; // 返回单例实例
}
};
Singleton* Singleton::instance = nullptr; // 初始化静态成员变量
```
在上面的例子中,我们将构造函数私有化,这样就可以防止外部直接创建实例。同时,我们使用静态成员变量 `instance` 来保存单例实例,并使用静态成员函数 `getInstance` 来获取单例实例。在 `getInstance` 函数中,我们首先检查实例是否已经存在,如果不存在就创建一个新的实例。最后,我们返回单例实例。
使用单例模式时需要注意线程安全问题,可以使用线程安全的实现方式来避免多线程问题。此外,单例模式也有一些缺点,例如可能会导致代码耦合性增加、难以进行单元测试等。因此,在使用单例模式时需要谨慎考虑。
c++单例模式带参数
在 C++ 中,单例模式通常用于确保某类只有一个实例,并提供全局访问点。当需要一个带参数的单例模式时,我们通常创建一个静态工厂函数,这个函数会根据传入的参数来构造并返回单例对象。下面是一个简单的示例:
```cpp
template <typename T>
class SingletonWithParam {
public:
// 构造函数为 private,防止直接实例化对象
SingletonWithParam(const ParamType& param) : data_(param) {}
// 静态获取唯一实例的工厂函数
static T* getInstance(const ParamType& param) {
static T instance(param); // 单例实例在这里通过模板初始化
return &instance;
}
// 返回带参数的数据成员
const T& getData() const { return data_; }
private:
// 数据成员作为模板参数的实例
T data_;
// 禁止复制构造和赋值操作
SingletonWithParam(const SingletonWithParam&) = delete;
SingletonWithParam& operator=(const SingletonWithParam&) = delete;
};
// 使用示例
SingletonWithParam<MyClass> *singleton = SingletonWithParam<MyClass>::getInstance(myParameter);
```
在这个例子中,`MyClass` 替换为具体的类名,`ParamType` 是传递给单例的参数类型,`myParameter` 是实际的参数值。
阅读全文