21xrx.com
2024-06-03 05:42:48 Monday
登录
文章检索 我的文章 写文章
C++单例模板实现
2023-07-08 15:14:28 深夜i     --     --
C++ 单例模式 模板 实现 设计模式

C++单例模式是一种设计模式,用于确保一个类只有一个实例,并提供全局访问该实例的机制。单例模式在许多场合下都非常有用,如数据库连接、线程池等对象的管理。

在C++中,实现单例模式有多种方法,其中一个常用的实现方式是使用模板。以下是一个简单的C++单例模板实现:


template<typename T>

class Singleton

{

private:

  static T* m_instance;

public:

  static T* getInstance()

  {

    if (m_instance == nullptr)

    {

      m_instance = new T();

    }

    return m_instance;

  }

  static void destroyInstance()

  {

    if (m_instance != nullptr)

    

      delete m_instance;

      m_instance = nullptr;

    

  }

protected:

  Singleton() {}

  virtual ~Singleton() {}

  Singleton(const Singleton&) = delete;

  Singleton& operator=(const Singleton&) = delete;

};

template<typename T>

T* Singleton<T>::m_instance = nullptr;

这个模板定义了一个名为Singleton的类模板,其中包含了一个静态的指向单例对象的指针m_instance。使用getInstance()方法来获取单例对象,如果实例还不存在,则通过new创建一个新实例;使用destroyInstance()方法来销毁单例对象,释放内存并将指针置为nullptr。

注意,这种实现方式还使用了C++11的delete关键字禁用了复制和赋值操作符,以确保只有一个实例存在。如果需要实现单例对象复制,可以将这两行代码注释掉。

使用这个单例模板也非常简单,只需继承自Singleton类,并将要实现单例模式的类作为模板参数即可,例如:


class MyClass : public Singleton<MyClass>

{

public:

  void foo() cout << "hello world" << endl;

private:

  friend class Singleton<MyClass>;

  MyClass() {}

  virtual ~MyClass() {}

};

这个示例中,MyClass继承自Singleton ,表示MyClass类是一个使用单例模式的类。注意,MyClass需要将Singleton 声明为友元,以便Singleton类可以访问MyClass的构造函数和析构函数。

现在可以通过getInstance()方法来获取MyClass类的实例,并通过调用foo()方法来使用它:


MyClass* obj1 = MyClass::getInstance();

obj1->foo(); // 输出 "hello world"

MyClass* obj2 = MyClass::getInstance();

assert(obj1 == obj2); // 断言obj1和obj2是同一个实例

MyClass::destroyInstance(); // 销毁单例对象

总之,C++单例模板是一种简单而可靠的实现单例模式的方式。如果您需要使用单例模式来管理对象生命周期,这种实现方式值得一试。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复