单类模板代码:
#pragma once
#include <QMutex>
template <class T>
class Singleton
{
protected:
Singleton(){};
private:
Singleton(const Singleton&){};
Singleton& operator=(const Singleton&){};
static T* m_instance;
static QMutex m_mutex;
public:
static T* GetInstance();
};
template <class T>
T* Singleton<T>::GetInstance()
{
if( m_instance == NULL)
{
m_mutex.lock();
if( m_instance == NULL)
{
T* ptmp = new T();
m_instance = ptmp;
}
m_mutex.unlock();
}
return m_instance;
}
template <class T>
T* Singleton<T>::m_instance = NULL;
#endif // Singleton_H
使用单类模板
#include <iostream>
#include <string>
#include "Singleton.h"
using namespace std;
class Test
{
friend class Singleton<Test> ; //声明Test的友元为单例类模板
private:
string mstr;
Test(): mstr("abc")
{
}
Test& operator = (const Test& t);
Test(const Test&);
public:
void Setmstr(string t)
{
mstr=t;
}
void print()
{
cout<<"mstr = "<<mstr<<endl;
cout<<"this = "<<this<<endl;
}
};
int main()
{
Test *pt1 = Singleton<Test>::getInstance();
Test *pt2 = Singleton<Test>::getInstance();
pt1->print();
pt2->print();
pt1->Setmstr("ABCDEFG");
pt2->print();
return 0;
}