使用cpp 写一个单例
时间: 2023-01-28 16:47:02 浏览: 88
确保单例模式的 C++ 实现可以被多线程安全地使用,可以使用如下代码:
```cpp
#include <mutex>
class Singleton {
public:
static Singleton& GetInstance() {
static Singleton instance;
return instance;
}
private:
Singleton() = default;
~Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
static std::mutex mutex_;
};
std::mutex Singleton::mutex_;
```
这样的话,每次调用 GetInstance 时都会对互斥量加锁,以保证线程安全。
请注意,在 C++11 之前的版本中,这种写法是不可行的,因为静态变量的初始化顺序是未定义的。在 C++11 之后,通过使用 `std::call_once` 来实现线程安全的单例模式是更好的方法。
相关问题
使用cpp 写一个单例模板
首先,单例模式是一种常用的设计模式,它提供了一个单独的类,该类的对象在整个应用程序中只有一个实例。在 C++ 中,可以使用模板来实现单例模式。
以下是一个使用模板实现单例模式的 C++ 代码示例:
```cpp
template <typename T>
class Singleton
{
public:
static T& getInstance()
{
static T instance;
return instance;
}
protected:
Singleton() {}
private:
Singleton(const Singleton&);
Singleton& operator=(const Singleton&);
};
```
使用这个模板,可以将任何类声明为单例类。例如,可以这样声明一个日志类:
```cpp
class Logger : public Singleton<Logger>
{
friend class Singleton<Logger>;
private:
Logger() {}
public:
void log(const std::string& message)
{
// 实现日志记录
}
};
```
然后,可以使用以下方式访问日志类的唯一实例:
```cpp
Logger& logger = Logger::getInstance();
logger.log("Hello, world!");
```
使用cpp11写一个单例模板
这是一个使用 C++11 实现的单例模板的示例:
```cpp
template <typename T>
class Singleton
{
public:
static T& getInstance()
{
static T instance;
return instance;
}
private:
Singleton() {}
~Singleton() {}
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(Singleton&&) = delete;
};
```
使用方法:
```cpp
class MyClass : public Singleton<MyClass>
{
friend Singleton<MyClass>;
private:
MyClass() {}
};
int main()
{
MyClass& instance = MyClass::getInstance();
return 0;
}
```