记录:QT关于单例类模板
文章目录
今天研究之前同事写的单例模式的时候,想着查查资料学习一下。现在做个记录。贴的代码已经经过测试,确保运行没有问题
当然,目前仍对此充满疑问,如果有看到这篇文章的大佬能解决一下我的疑问。
此文章写于2024/07/20。
关于单例模式有兴趣的可以查看:
单例模式详解及代码案例与应用场景(饿汉式单例模式、懒汉式单例模式、注册式单例模式)
我使用的目前都是懒汉模式的单例类
代码1
使用了双重检查锁定的单例类
将这个单例类设置成为全局变量,这样工程中所有类都能使用
#pragma once
#ifndef SIGNALSTATION_H
#define SIGNALSTATION_H
#include <QObject>
#include <QMutex>
#include <QSerialPortInfo>
/**
* @brief The SignalStation class 信号中转站类
*/
class SignalStation : public QObject
{
Q_OBJECT
public:
static SignalStation *instance();//获取单例
static void release();//智能指针释放
signals:
private:
SignalStation();
static QMutex mutex;
static SignalStation *signalStationInstance;//静态指针
};
#endif // SIGNALSTATION_H
#include "signalstation.h"
QMutex SignalStation::mutex;
SignalStation* SignalStation::signalStationInstance=nullptr;
void SignalStation::release()
{
if(signalStationInstance !=NULL)
{
delete signalStationInstance;
signalStationInstance = NULL;
}
}
SignalStation::SignalStation()
{
}
SignalStation *SignalStation::instance()
{
if(signalStationInstance==NULL){
//上锁,防止多线程同时调用创建2个对象,或修改原对象
mutex.lock();
//再次判断,防止被其他进程抢先new过一次
if(signalStationInstance==NULL){
signalStationInstance=new SignalStation;
}
mutex.unlock();//解锁
}
return signalStationInstance;
}
代码2
作为一个工作1年的菜鸟,我习惯了拿来主义。但现在任然想给自己增加一点知识。
模板,所有的类只要包含了头文件,都可以变成单例类
.cpp文件不需要。
#ifndef QTSINGLETONTEMPLATE_H
#define QTSINGLETONTEMPLATE_H
#include <QScopedPointer>
#include <QMutex>
template <typename T>
class QtSingletonTemplate
{
public:
static T* Instance(){
if (m_instance.isNull()){
static QMutex mutex;
QMutexLocker locker(&mutex);
if (m_instance.isNull()){
m_instance.reset(new T);
}
}
return m_instance.data();
};
private:
QtSingletonTemplate() = default;
~QtSingletonTemplate() = default;
QtSingletonTemplate(const QtSingletonTemplate &) = delete;
QtSingletonTemplate& operator=(const QtSingletonTemplate &) = delete;
static QScopedPointer<T> m_instance;
};
template<typename T>
QScopedPointer<T> QtSingletonTemplate<T>::m_instance;
#endif // QTSINGLETONTEMPLATE_H
上面这个代码我尝试将Instance这个静态函数写在.cpp中,在调用的时候就会出现这个错误提示:
error: ld returned 1 exit status。在网上查阅了相关资料也没有得到让仍和帮助。如果有大佬看到这个文章,希望可以指点我一下。我是真的不懂QAQ