Documentation Documentation
主页
指南
DTK
经验分享
社区作品
关于
  • 简体中文
  • English
  • Español
GitHub (opens new window)

Deepin

Deepin 社区文档
主页
指南
DTK
经验分享
社区作品
关于
  • 简体中文
  • English
  • Español
GitHub (opens new window)
  • Dtk文档总集合
  • 接口changelog
  • UOS-Deepin 中配置 DTK 开发环境
  • Dtk的历史起源、发展,和简单入门
  • Dtkcore提供的单例类DSingleton的用法
  • Dtk自动保存主题
  • 主题相关知识集锦
  • Dtk播放系统音效
  • 如何实现单例进程
  • DSettingsDialog使用json创建对话框及其国际化
  • DLabel的ElideMode
  • Dtkcore的DExportedInterface接口的用途
  • 判断是否社区版、如何显示 Logo 以及获取发行版名称
  • Dtk 前期准备、绘画 Qt 自带控件、创建及绘画自定义控件
  • Dtk 常用、测试代码片
  • 使用 DDesktopEntry 解析 desktop 文件
  • Dtk加载翻译文件
  • Dtk 日志管理
  • Dtk相关配置目录
  • DTK 对 pkg-config 命令的支持
  • DDesktopServices的使用
  • Dtk汉字转拼音
  • 清空回收站
  • DPathBuf拼接路径
  • 如何调用外部程序
  • DAnchors的使用
  • DBlurEffectWidget的使用
  • 窗口模糊效果
  • Codeanalysis工具的使用
  • 代码格式化脚本pre-commit
  • Qt5 GUI程序界面启动耗时统计工具
  • Scrollbar 设置为上下(左右)不到顶端
  • DAbstractUnitFormatter 单位格式化工具
  • Dtk-translate工具
  • DSettings 工具
  • Deepin-os-release 工具
  • Dlistview DViewItemActionsetwidget 用法
  • DTK问题判定方法
  • 题栏菜单没有「帮助」菜单项
  • DBackgroundGroup 移除一项后,下边的圆角没有刷新
  • 在标题栏拖动鼠标出现无法拖动窗口的问题
  • 锁屏状态下音乐播放控件状态异常
  • 应用图标异常
  • 为什么bug状态为已解决,验证依旧不通过
  • 为何我的标题栏右键菜单的背景色与应用窗口颜色不一致
  • DTK 基础教程:自定义控件规范
  • 制作 dde-control-center 插件
  • DTK
Deepin | Any developer
2020-12-11

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();
};

需要注意的几点如下:

  1. 单例类 Worker 的构造函数一定要使用protected或者private权限,这样使用这个类的用户就必须使用单例类提供的 instance 接口,不然会出现编译错误,使用protected或者private权限就从语法上可以避免多个实例的误用
  2. 需要声明友元类,friend class DSingleton <Worker>,因为第一点的缘故,如果此时不声明友元类,模板类在第一次初始化时就无权限访问构造函数,会出现编译报错
  3. 因为C++多重继承,基类的初始化顺序是按照声明的顺序,在使用 Q_OBJECT 宏的时候,内部会有 Qt 的一些初始化操作,此时声明 DSingleton 模板类应该放在 QObject 的后面,不然会出现编译报错
  4. 析构函数需要 public 权限,不然在使用delete销毁对象时,会出现编译报错,因为此时无权限访问析构函数
帮助编辑此页 (opens new window)
上次更新: 12/17/2020, 2:23:36 AM
Dtk的历史起源、发展,和简单入门
Dtk自动保存主题

← Dtk的历史起源、发展,和简单入门 Dtk自动保存主题→

Theme by Vdoing | Copyright © 2020-2021 Deepin | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式