Qt项目第三弹-单例全局类

自定义单例模板

#ifndef SINGLETON_H
#define SINGLETON_H

/***************************************************************
*  @Brief:      构建单例模板
*  @Author:     springIce
*  @Date:       2024-02-02
****************************************************************/

template <typename T>
class Singleton {
public:

    /**
    *  @Brief:      对外唯一接口,单例核心
    *  @Author:     springIce
    *  @Date:       2024-02-02
    **/
    static T* getInstance() {
        static T instance;
        return &instance;
    }

private:

    /**
    *  @Brief:      构造函数/拷贝构造函数/赋值函数均私有
    *  @Author:     springIce
    *  @Date:       2024-02-02
    **/
    Singleton();
    Singleton(const T &singleton){}
    Singleton &operator = (const T &singleton){}

};

#endif // SINGLETON_H

调用单例模板

这里以全局数据缓存为例,一个项目不可或缺的类

#ifndef DATACACHE_H
#define DATACACHE_H

#include 

#include "singleton.h"

/***************************************************************
*  @Brief:      调用单例模板
*  @Author:     springIce
*  @Date:       2024-02-02
****************************************************************/

class DataCache : public QObject
{
    Q_OBJECT
public:

    /**
    *  @Brief:      全局调用函数,复杂参数可使用struct
    *  @Author:     springIce
    *  @Date:       2024-02-02
    **/
    QString &getName();
    void setName(const QString &name);

public:
    friend class Singleton<DataCache>;

private:
    QString m_name;
};


/**
    *  @Brief:      将单例声明为宏方便外部调用
    *  @Author:     springIce
    *  @Date:       2024-02-02
    **/
#define DATACACHE Singleton<DataCache>::getInstance()

#endif // DATACACHE_H

#include "datacache.h"

QString &DataCache::getName()
{
    return m_name;
}

void DataCache::setName(const QString &name)
{
    m_name = name;
}

实际效果

调用实现代码如下

	Test::setName("Fantastic");
    qDebug() << DATACACHE->getName();
    DATACACHE->setName("springIce");
    qDebug() << DATACACHE->getName();
  • 在不同函数中对全局单例进行赋值并打印,完全没有问题

在这里插入图片描述


以上实现方式仅适用于非多线程调用,多线程调用使用上述方式无法做到真正的全局

你可能感兴趣的:(qt,开发语言)