单列模版
#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_
使用案列
#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> ReticleZeroIndex();QList<DataNode> PowerSettingIndex();QList<DataNode> RecordSettingIndex();QList<DataNode> GeneralSettingIndex();QList<DataNode> ReticleSettingIndex();QList<DataNode> DateTimeSettingIndex();
};#endif