当前位置: 首页 > news >正文

单例模式的学习

示例:

#ifndef TEST_H
#define TEST_Hclass test
{
public:static test * GetINSTANCE();void print();
private:test();
};#endif // TEST_H
#include "test.h"
#include <QMutex>
#include <QDebug>
test::test()
{}test *test::GetINSTANCE()
{static test * inst = nullptr;static QMutex mutex;mutex.lock();if(!inst){inst = new test;}mutex.unlock();return inst;
}void test::print()
{static int m = 0;m++;qDebug()<<__FILE__<<"["<<__LINE__<<"]"<< m;
}

补充:

这样写也可以:

    static T * GetINSTANCE(){static QScopedPointer<T> inst;static QMutex mutex;mutex.lock();if(!inst){inst.reset(new T());}mutex.unlock();return inst.data();}
    test::GetINSTANCE()->print();test::GetINSTANCE()->print();test::GetINSTANCE()->print();

..\try\test.cpp [ 26 ] 1

..\try\test.cpp [ 26 ] 2

..\try\test.cpp [ 26 ] 3

使用类模板进行简单的优化,使代码扩展性更好一些:

#ifndef TEST_H
#define TEST_H#include <QMutex>template<typename T>
class Singleton
{
public:static T * GetINSTANCE(){static T * inst = nullptr;static QMutex mutex;mutex.lock();if(!inst){inst = new T();}mutex.unlock();return inst;}
protected:Singleton() = default;
};class test:public Singleton<test>
{friend class Singleton<test>;
public:void print();
private:test() = default;
};
#endif // TEST_H
#include "test.h"
#include <QDebug>void test::print()
{static int m = 0;m++;qDebug()<<__FILE__<<"["<<__LINE__<<"]"<< m;
}
    test::GetINSTANCE()->print();test::GetINSTANCE()->print();test::GetINSTANCE()->print();

..\try\test.cpp [ 11 ] 1

..\try\test.cpp [ 11 ] 2

..\try\test.cpp [ 11 ] 3

http://www.lryc.cn/news/437125.html

相关文章:

  • 54 mysql 中各种 timeout - connect/wait/interactive/read/write_timeout
  • 实战案例(5)防火墙通过跨三层MAC识别功能控制三层核心下面的终端
  • 【智能流体力学】数值模拟中的稳态和瞬态
  • Vue-Route4 ts
  • sizeof和strlen的小知识
  • Java项目: 基于SpringBoot+mybatis+maven宠物咖啡馆平台(含源码+数据库+毕业论文)
  • 戴尔14代服务器配置IDRAC9远程配置说明
  • 如何让你家里的电脑连接公司的远程桌面
  • 软件:分享8个常用视频剪辑免费软件,你都用过吗?
  • TS 常用类型
  • 半导体芯闻--20240913
  • C盘空间不足如何解决?解决C盘空间不足的7个方法
  • 比 GPT-4 便宜 187 倍的Mistral 7B (非广告)
  • FFmpeg与OpenCV联合开发
  • Docker 部署 Redis (图文并茂超详细)
  • Docker基础-Docker Compose使用
  • GPT撰写开题报告教程——课题确定及文献调研
  • SprinBoot+Vue高校就业管理系统的设计与实现
  • 【人工智能】Transformers之Pipeline(十八):文本生成(text-generation)
  • 判断当前用户登录时常是否超过两个小时
  • nacos明明配置了远程连接地址却一直连接本地的详细配置解释
  • Superset二次开发之源码 run-server.sh 分析
  • Java 之四种内部类详解
  • 03:手动可变电阻
  • 嵌入式Linux电池管理(TODO)
  • Python 求亲和数
  • 【C++】——vector模拟实现和迭代器失效问题
  • USB 3.1 标准 A 型连接器及其引脚分配
  • 机器学习文献|基于循环细胞因子特征,通过机器学习算法预测NSCLC免疫治疗结局
  • Qt 实现自定义截图工具