当前位置: 首页 > 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.mrgr.cn/news/24039.html

相关文章:

  • gradle 学习备忘
  • C++11(2)
  • JsonCpp源码分析——Reader
  • Java 访问修饰符详解:public、private、protected 及默认访问权限
  • 06_自平衡二叉搜索树
  • 【Petri网导论学习笔记】Petri网导论入门学习(二)
  • java基础-IO(6)转换流InputStreamReader、OutputStreamWriter
  • 元学习之应用案例
  • UML之类图详解
  • 《深入理解 JavaScript 中的定时器》
  • 一篇文章搞懂SQL优化
  • 学会这2项技能,普通人每年多赚10万+,互联网创业者必备!
  • Kerberos:更安全的网络认证协议
  • 香帅的金融学讲义:深入剖析与解读
  • Sklearn的datasets模块与自带数据集介绍
  • 使用 gdb 在汇编指令层面对程序注入、修改
  • 数据结构与算法1: 链表
  • Linux内核 -- 内存管理之 lru_cache_add_inactive_or_unevictable 函数
  • [Linux]:文件(下)
  • MySQL-CRUD入门2