自定义单例模板
#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 <QObject>
#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();
- 在不同函数中对全局单例进行赋值并打印,完全没有问题
以上实现方式仅适用于非多线程调用,多线程调用使用上述方式无法做到真正的全局