v1.0.0
This commit is contained in:
+91
@@ -0,0 +1,91 @@
|
||||
#ifndef SINGLETON_H
|
||||
#define SINGLETON_H
|
||||
|
||||
#include <QMutex>
|
||||
#include <QScopedPointer>
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// ///
|
||||
/// Singleton signature ///
|
||||
/// ///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/**
|
||||
* 使用方法:
|
||||
* 1. 定义类为单例:
|
||||
* class ConnectionPool {
|
||||
* SINGLETON(ConnectionPool) // Here
|
||||
* public:
|
||||
*
|
||||
* 2. 实现无参构造函数,析构函数
|
||||
* 3. 获取单例类的对象:
|
||||
* Singleton<ConnectionPool>::getInstance();
|
||||
* ConnectionPool &pool = Singleton<ConnectionPool>::getInstance();
|
||||
* 注意: 如果单例的类需要释放的资源和 Qt 底层的信号系统有关系,例如 QSettings,QSqlDatabase 等,
|
||||
* 需要在程序结束前手动释放(也就是在 main() 函数返回前调用释放资源的函数),
|
||||
* 否则有可能在程序退出时报系统底层的信号错误,导致如 QSettings 的数据没有保存。
|
||||
*/
|
||||
template <typename T>
|
||||
class Singleton
|
||||
{
|
||||
public:
|
||||
static T& getInstance()
|
||||
{
|
||||
static T instance;
|
||||
return instance;
|
||||
};
|
||||
|
||||
Singleton(T &&) = delete;
|
||||
Singleton(const T &) = delete;
|
||||
void operator = (const T &) = delete;
|
||||
T *operator &() = delete;
|
||||
|
||||
private:
|
||||
Singleton() = default;
|
||||
virtual ~Singleton() = default;
|
||||
// static QMutex mutex;
|
||||
// static QScopedPointer<T> instance;
|
||||
};
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// ///
|
||||
/// Singleton definition ///
|
||||
/// ///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#if 0
|
||||
//template <typename T> QMutex Singleton<T>::mutex;
|
||||
//template <typename T> QScopedPointer<T> Singleton<T>::instance;
|
||||
|
||||
//template <typename T>
|
||||
//T& Singleton<T>::getInstance()
|
||||
//{
|
||||
// if (instance.isNull())
|
||||
// {
|
||||
// mutex.lock();
|
||||
// if (instance.isNull())
|
||||
// {
|
||||
// instance.reset(new T());
|
||||
// }
|
||||
// mutex.unlock();
|
||||
// }
|
||||
|
||||
// return *instance.data();
|
||||
//}
|
||||
#endif
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
/// ///
|
||||
/// Singleton Macro ///
|
||||
/// ///
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
#if 0
|
||||
//#define SINGLETON(Class) \
|
||||
//private: \
|
||||
// Class(); \
|
||||
// ~Class(); \
|
||||
// Class(const Class &other); \
|
||||
// Class& operator=(const Class &other); \
|
||||
// friend class Singleton<Class>; \
|
||||
// friend struct QScopedPointerDeleter<Class>;
|
||||
#endif
|
||||
#define SINGLETON(Class) friend class Singleton<Class>
|
||||
#endif // SINGLETON_H
|
||||
Reference in New Issue
Block a user