Dtkcore提供的单例类DSingleton的用法
Dtkcore提供的单例类DSingleton的用法
在开发应用程序时,在业务逻辑的实现上时常需要保证一个类只有一个实例,这就需要使用单例模式,通常来讲,单例模式细分为懒汉模式和饿汉模式, dtk提供了一个懒汉模式的单例模板类,这里简要介绍一下使用方法,代码不多,先贴一段代码
template <class T>
class DSingleton
{
public:
static inline T *instance()
{
static T *_instance = new T;
return _instance;
}
protected:
DSingleton(void) {}
~DSingleton(void) {}
DSingleton(const DSingleton &) {}
DSingleton &operator= (const DSingleton &) {}
};
这就是单例模板类的全部实现,在使用上需要注意几点,先展示一段正确的用法
class Worker : public QObject, public DSingleton<Worker>
{
Q_OBJECT
friend class DSingleton<Worker>;
private:
Worker(QObject *parent = nullptr);
public:
~Worker();
};
需要注意的几点如下:
- 单例类 Worker 的构造函数一定要使用protected或者private权限,这样使用这个类的用户就必须使用单例类提供的 instance 接口,不然会出现编译错误,使用protected或者private权限就从语法上可以避免多个实例的误用
- 需要声明友元类,
friend class DSingleton <Worker>
,因为第一点的缘故,如果此时不声明友元类,模板类在第一次初始化时就无权限访问构造函数,会出现编译报错 - 因为C++多重继承,基类的初始化顺序是按照声明的顺序,在使用 Q_OBJECT 宏的时候,内部会有 Qt 的一些初始化操作,此时声明 DSingleton 模板类应该放在 QObject 的后面,不然会出现编译报错
- 析构函数需要 public 权限,不然在使用delete销毁对象时,会出现编译报错,因为此时无权限访问析构函数
帮助编辑此页 (opens new window)
上次更新: 12/17/2020, 2:23:36 AM