qt实现单例类的两种方法

使用qt自带的宏编写一个饿汉式的单例方法

1.创建一个类,继承Object

2.在.h文件中定义一个instance方法,为了方便还可以取个别名方便使用

3.在.h文件中实现instance,并且引入宏Q_GLOBAL_STATIC(类名,实例名)

.h

#ifndef MANPLUGIN_H
#define MANPLUGIN_H

#include <QObject>

#define MP ManPlugin::instance()
class ManPlugin : public QObject
{
    Q_OBJECT
public:
    explicit ManPlugin(QObject *parent = nullptr);
    
    static ManPlugin* instance();
signals:
};

#endif // MANPLUGIN_H

.cpp

#ifndef MANPLUGIN_H
#define MANPLUGIN_H

#include <QObject>

#define MP ManPlugin::instance()
class ManPlugin : public QObject
{
    Q_OBJECT
public:
    explicit ManPlugin(QObject *parent = nullptr);
    
    static ManPlugin* instance();
signals:
};

#endif // MANPLUGIN_H

用c++实现的懒汉式

用一个全局信号的单例类举例

.h

#ifndef GLOBAL_H
#define GLOBAL_H

#include <QObject>

//全局信号转发单例类
class GlobalObj : public QObject
{
    Q_OBJECT

public:
    //获取单实例
    static GlobalObj* getInstance();
    //释放单实例
    static void deleteInstance();

signals:
    void sig_xixi();
    void sig_buxixi();


private:
    //构造、析构、拷贝构造、赋值构造私有
    GlobalObj(){}
    ~GlobalObj(){}
    GlobalObj(const GlobalObj &){}
    const GlobalObj &operator=(const GlobalObj &){}

private:
    //单实例对象指针
    static GlobalObj *obj;
};


//全局参数类
class GlobalData
{
public:
    static QString version;
};

#endif

.cpp

#include "global.h"

//全局信号转发单例类
GlobalObj* GlobalObj::obj = new GlobalObj();
GlobalObj *GlobalObj::getInstance()
{
    return obj;
}

void GlobalObj::deleteInstance()
{
    if(obj)
    {
        delete obj;
        obj = nullptr;
    }
}

//全局参数类
QString GlobalData::version = "1.0";

推荐使用官方宏定义方法的饿汉式,更安全不容易出错

另外说一下饿汉式的优缺点

优点:

  1. 实现简单:代码实现相对简单,易于理解和维护。
  2. 线程安全:由于实例是在类加载时创建的,因此不存在多线程环境下的同步问题。
  3. 资源消耗明确:实例创建的时间和空间消耗是可预测的,便于资源管理。

缺点:

  1. 可能的资源浪费:如果单例对象在整个程序生命周期中从未被使用,那么它的创建就是一种资源浪费。
  2. 增加启动时间:实例在程序启动时就创建,可能会增加程序的启动时间。
  • 9
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值