qt初入门10:常用的单例,代码做个记录备份

简单想想:实现单例时,需要考虑对象唯一,不允许用户实例化,考虑初始化时线程安全,该单例对象的释放问题。

实现单例可以从以下入手:
1:借助static静态成员变量,保证唯一。
2:禁用构造函数,提供静态成员函数初始化/获取该唯一对象。
3:考虑多线程的安全,初始化该对象前考虑加锁。
4:考虑该对象的释放,栈对象不用考虑,堆对象的释放可以借助智能指针/单例类中类析构时释放。

最近用qt比较多,看到一个好的demo,一直用,做个备份。

//interface_test.h   头文件
#ifndef INTERFACE_TEST_H
#define INTERFACE_TEST_H

#include <QScopedPointer> //qt提供的独占式智能指针,用于管理单一所有权对象。
class interface_test
{
private:   //私有化
    interface_test();
public:
    static interface_test *Instance();

    //其他对外提供的接口
    int one_test(){return 1; }
private:
    static QScopedPointer<interface_test> self;   //注意cpp中的初始化
};

#endif // INTERFACE_TEST_H

对应的cpp文件 interface_test.cpp

//interface_test.cpp
#include "interface_test.h"
#include <QMutex>

interface_test::interface_test(){}

//局部静态变量  以及智能指针自动释放
QScopedPointer<interface_test> interface_test::self;
interface_test *interface_test::Instance()
{
    if (self.isNull()) {
        static QMutex mutex;   //局部静态变量  第一次调用时初始化 只会初始化一次
        QMutexLocker locker(&mutex);
        if (self.isNull()) {
            self.reset(new interface_test);
        }
    }
    return self.data();
}

简单main函数

#include <QDebug>
#include "interface_test.h"
int main(int argc, char *argv[])
{
//    interface_test test;   //会报错 构造函数私有
    qDebug()<<interface_test::Instance()->one_test();
    return 0;
}

这个代码感觉挺好的,做个备份,至于更优(调用更简单),把单例封装成模板,借助c++宏等方案,参考Qt 单例模式的实现(4种方法) - 一杯清酒邀明月 - 博客园 (cnblogs.com)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值