在 C++ 中,使用 Qt 框架实现单例模式可以确保一个类只有一个实例,并提供一个全局访问点。以下是一个简单的 C++ Qt 单例模式实现示例。
1. 饿汉式单例模式
饿汉式单例模式在类加载时就初始化单例对象。
// MySingleton.h #ifndef MYSINGLETON_H #define MYSINGLETON_H #include <QObject> class MySingleton : public QObject { Q_OBJECT public: // 获取单例实例的静态方法 static MySingleton& instance() { static MySingleton instance; return instance; } // 禁止拷贝构造和赋值 MySingleton(const MySingleton&) = delete; MySingleton& operator=(const MySingleton&) = delete; signals: // 可以定义一些信号 public slots: // 可以定义一些槽函数 private: // 私有构造函数和析构函数 MySingleton() {} ~MySingleton() {} }; #endif // MYSINGLETON_H
2. 懒汉式单例模式
懒汉式单例模式在第一次调用 instance() 时才初始化单例对象。
// MySingleton.h #ifndef MYSINGLETON_H #define MYSINGLETON_H #include <QObject> #include <QMutex> #include <QScopedPointer> class MySingleton : public QObject { Q_OBJECT public: // 获取单例实例的静态方法 static MySingleton& instance() { static QMutex mutex; if (!m_instance) { QMutexLocker locker(&mutex); if (!m_instance) { m_instance.reset(new MySingleton()); } } return *m_instance; } // 禁止拷贝构造和赋值 MySingleton(const MySingleton&) = delete; MySingleton& operator=(const MySingleton&) = delete; signals: // 可以定义一些信号 public slots: // 可以定义一些槽函数 private: // 私有构造函数和析构函数 MySingleton() {} ~MySingleton() {} static QScopedPointer<MySingleton> m_instance; }; #endif // MYSINGLETON_H
// MySingleton.cpp #include "MySingleton.h" QScopedPointer<MySingleton> MySingleton::m_instance(nullptr);
3. 使用示例
在任何地方使用单例:
#include "MySingleton.h" // 获取单例实例 MySingleton& singleton = MySingleton::instance();
关键点总结:
线程安全:Qt 中提供了 QMutex 和 QMutexLocker 来确保线程安全。
防止拷贝:通过删除拷贝构造函数和赋值运算符来防止拷贝。
全局访问:通过 instance() 方法获取单例实例。
示例展示了如何在 Qt 中实现单例模式,包括线程安全的懒汉式实现和直接初始化的饿汉式实现。