02 单例模式

本文介绍了C++中两种常见的单例模式实现方式:饿汉模式和懒汉模式。饿汉模式在类加载时就完成了实例化,线程安全但可能导致资源浪费;懒汉模式则在首次调用时才创建实例,需考虑多线程同步问题。此外,还提供了一个模板化的单例模式实现,以简化代码并确保线程安全。
摘要由CSDN通过智能技术生成

这篇文章总结的挺好:单例模式总结
以下代码摘自于此篇文章:

饿汉模式

// 饿汉式单例的实现
#ifndef C_SINGLETON_H
#define C_SINGLETON_H
 
#include<iostream>
using namespace std;
class CSingleton
{
private:
	CSingleton(){ cout << "单例对象创建!" << endl; };
	CSingleton(const CSingleton &);
	CSingleton& operator=(const CSingleton &);
	~CSingleton(){ cout << "单例对象销毁!" << endl; };
 
	static CSingleton myInstance; // 单例对象在这里!
public:
	static CSingleton* getInstance()
	{		
		return &myInstance;
	}
};
 
#endif
//主文件,用于测试用例的生成
#include<iostream>
#include"CSingleton.h"
 
using namespace std;
CSingleton CSingleton::myInstance; 
int main()
{
	CSingleton *ct1 = CSingleton::getInstance();
	CSingleton *ct2 = CSingleton::getInstance();
	CSingleton *ct3 = CSingleton::getInstance();
 
	return 0;
}

懒汉模式

懒汉模式,需要考虑多线程问题,源码待添加

单例模式的模板方法

#pragma once

template<typename T>
class Singleton
{
protected:
    Singleton() = default;

public:
    Singleton(Singleton const&) = delete;
    Singleton(Singleton&&) = delete;
    Singleton& operator=(Singleton const&) = delete;
    Singleton& operator=(Singleton&&) = delete;

    static T& getInstance()
    {
        static T inst;
        return inst;
    }
};

模板单例使用案例

#ifndef TOASTDIALOG_H
#define TOASTDIALOG_H

#include <QDialog>
#include <QTimer>
#include <QFont>
#include "utils/Singleton.h"

namespace Ui {
class ToastDialog;
}

class ToastDialog : public QDialog, public Singleton<ToastDialog>
{
    Q_OBJECT

public:
    explicit ToastDialog(QWidget *parent = nullptr);
    ~ToastDialog();
    void setText(const QString& text);
    void setIconPath(const QString& path);
    void setIconVisible(bool visible);
    void startTimer(int interval = 2000);
private:
    Ui::ToastDialog *ui;
    QTimer *m_pTimer;
    QFont m_font;
};

#endif // TOASTDIALOG_H

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值