QT:单例

单例的定义

官方定义:单例是指确保一个类在任何情况下都绝对只有一个实例并提供一个全局访问点。

单例的写法

抓住3点:

  • 构造函数私有化(确保只有一个实例)
  • 提供一个可以获取构造实例的接口(提供唯一的实例)
  • 正常写你需要实现的函数

 举个例子

①就是构造函数私有化,把构造函数放在private

②就是提供一个可以获取实例的接口,这个实例就是私有变量_singleton

③就是正常需要实现的函数,正常咋写就咋写,但最好是独立的且需要多次被使用

用法

在需要使用单例的文件中添加单例的头文件

举个例子,我要在A中使用单例中的函数,那么我就在A.cpp中添加单例头文件

#include "Singleton.h"

然后再需要调用函数的地方通过单例的init获取实例,然后调用需要使用的函数

filePath = _fileLocalPath + Singleton::init()->getRelativePath(_currentProcessItem,"");
重点就是这句Singleton::init()->getRelativePath(_currentProcessItem,"");

红色部分是获取单例的实例,黄色部分就是调用单例的函数。

单例代码

.h

#ifndef SINGLETON_H
#define SINGLETON_H

#include <QSharedPointer>
#include <QMutex>
#include <QStandardItem>
#include <QFileInfo>
class Singleton: public QObject
{
    Q_OBJECT
public:
    ~Singleton() override;
    static QSharedPointer<Singleton>& init();
    static void doDeleteLater(Singleton *obj);
    static void releaseThis();

    // 单例类中需要实现的函数
    bool isDirVisible(QString text);
    
private:
    explicit Singleton(QObject *parent = nullptr);
    static QSharedPointer<Singleton > _singleton;
    static QMutex _mutex;
};

#endif // SINGLETON_H

.cpp

#include "Singleton.h"
#include <QMutexLocker>
#include <QStandardItem>
QMutex Singleton::_mutex;
QSharedPointer<Singleton> Singleton::_singleton;

Singleton::Singleton(QObject *parent): QObject(parent)
{

}

Singleton::~Singleton()
{

}

void Singleton::doDeleteLater(Singleton *obj)
{
    obj->deleteLater();
}
void Singleton::releaseThis()
{
    _singleton.clear();
}

QSharedPointer<Singleton> &Singleton::init()
{
    //初始化决定了它所在的线程
    if (_singleton.isNull()){
        QMutexLocker mutexLocker(&_mutex);
        if (_singleton.isNull()){
            //发现 doDeleteLater 会崩溃
            _singleton = QSharedPointer<Singleton>(new Singleton()/*,doDeleteLater*/);
        }
    }
    return _singleton;
}

//下面写需要实现的正常函数

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值