C++设计模式——单例模式(Qt单例写日志模块)

C++设计模式——单例模式(Qt单例写日志模块)

作用:保证一个类只有一个实例,并提供一个访问它的全局访问点,使得系统中只有唯一的一个对象实例。

应用:常用于管理资源,如日志、线程池

实现要点:

在类中,要构造一个实例,就必须调用类的构造函数,并且为了保证全局只有一个实例,

需防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为private,

同时阻止拷贝创建对象时赋值时拷贝对象,因此也将它们声明并权限标记为private;

另外,需要提供一个全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。

首先,构造函数声明成private的目的是只允许内部调用,getInstance()中的静态局部变量创建时调用,但不允许外部调用构造创建第二个实例;

然后,拷贝构造和拷贝赋值符是声明成了private而不给出定义,其目的是阻止拷贝,如果企图通过拷贝构造来创建第二个实例,编译器会报错。

阻止拷贝的另一种写法是声明后接一个"=delete",也能起到相同的作用(C++11)。

class ZLSingletonLog : public QObject
{
    Q_OBJECT
private:
    ZLSingletonLog() { }                                   //防止外部调用构造创建对象
    ~ZLSingletonLog(){ }                                   //析构函数
    ZLSingletonLog(const ZLSingletonLog &);                //阻止拷贝创建对象
    ZLSingletonLog& operator = (const ZLSingletonLog &);   //阻止赋值对象
public:
    static ZLSingletonLog *getInstance();
    //打开日志并创建日志文件夹  默认为程序启动路径
    void openLogFile(const QString &fileName, const QString &filePath = QCoreApplication::applicationDirPath());
    //清理日志文件下日志数量  默认保留90天日志
    void clearLogFile(const QString &filePath, const int &saveNum = 90);
    //写消息到日志,新的一天会重新写一个log文件
    void sysLog(const QString &info);
    void closeLog();
};
ZLSingletonLog *ZLSingletonLog::getInstance()
{
    static ZLSingletonLog *plog = nullptr;    //一个静态变量,只有第一次为空时,才会new
    if (plog == nullptr) {
        static QMutex mutex;                  //这里再加一个锁(不加也没事)
        QMutexLocker locker(&mutex);
        plog = new ZLSingletonLog();
    }
    return plog;
}

最后,完成源码下载地址:

https://download.csdn.net/download/ZLOZL/12870015

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZLOZL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值