单列模版
cpp
#ifndef _SINGTON_H_
#define _SINGTON_H_
#include <QMutex>
#include <QSharedPointer>
template<typename T>
class Singleton {
public:
static T *instance() {
if(m_instance.isNull()){
QMutexLocker lock(&m_mutex);
if(m_instance.isNull()){
m_instance=QSharedPointer<T>(new T);
}
}
return m_instance.data();
}
virtual ~Singleton()=0;
protected:
Singleton() {
}
private:
static QMutex m_mutex;
static QSharedPointer<T> m_instance;
};
template <typename T>
Singleton<T>::~Singleton<T>(){
}
template<typename T>
QMutex Singleton<T>::m_mutex;
template<typename T>
QSharedPointer<T> Singleton<T>::m_instance;
#define DECLARE_SINGTON_CONSTRUCT(CLASS_NAME)\
protected: \
CLASS_NAME(); \
friend class Singleton<CLASS_NAME>;\
public:\
virtual ~CLASS_NAME();
#define DECLARE_SINGTON_CONSTRUCT_WITH_BASE(CLASS_NAME,BASE_NAME)\
protected:\
CLASS_NAME(BASE_NAME*parent=nullptr);\
friend class Singleton<CLASS_NAME>;\
public:\
virtual ~CLASS_NAME();
#endif _SINGTON_H_
使用案列
cpp
#ifndef GENERATEDATANODE_H
#define GENERATEDATANODE_H
#include "listnode.h"
#include "uicommondef.h"
#include "base/Singleton.hpp"
class GenerateDataNode : public Singleton<GenerateDataNode>
{
DECLARE_SINGTON_CONSTRUCT(GenerateDataNode)
public:
QList<DataNode> buildDataNode(const MENU_WIDGET_INDEX &index);
protected:
QList<DataNode> DiyMenuManagerIndex();
QList<DataNode> DiySlideMenuIndex();
QList<DataNode> MainMenuIndex();
QList<DataNode> ShortCutMenuIndex();
QList<DataNode> ColorPalettesIndex();
QList<DataNode> ImageSettingIndex(); // 图像设置菜单
// QList<DataNode> CompensttionIndex();
QList<DataNode> ReticleZeroIndex();
QList<DataNode> PowerSettingIndex();
QList<DataNode> RecordSettingIndex();
QList<DataNode> GeneralSettingIndex();
QList<DataNode> ReticleSettingIndex();
QList<DataNode> DateTimeSettingIndex();
};
#endif // GENERATEDATANODE_H