#include <memory>
using namespace std;
class CSingletonAutoPtr
{
private:
static auto_ptr<CSingletonAutoPtr> m_auto_ptr;
static CSingletonAutoPtr* m_instance;
protected:
CSingletonAutoPtr();
CSingletonAutoPtr(const CSingletonAutoPtr&);
virtual ~CSingletonAutoPtr();
//allow auto_ptr to delete, using protected ~CSingletonAutoPtr()
friend class auto_ptr<CSingletonAutoPtr>;
public:
static CSingletonAutoPtr* GetInstance();
void Test();
};
//SingletonAutoPtr.cpp
#include "SingletonAutoPtr.h"
#include <iostream>
//initial static member vars here
CSingletonAutoPtr* CSingletonAutoPtr::m_instance = NULL;
auto_ptr<CSingletonAutoPtr> CSingletonAutoPtr::m_auto_ptr;
/
// Construction/Destruction
/
CSingletonAutoPtr::CSingletonAutoPtr()
{
cout << "CSingletonAutoPtr::CSingletonAutoPtr()" << endl;
//put single object into auto_ptr object
m_auto_ptr = auto_ptr<CSingletonAutoPtr>(this);
}
CSingletonAutoPtr::~CSingletonAutoPtr()
{
cout << "CSingletonAutoPtr::~CSingletonAutoPtr()" << endl;
}
CSingletonAutoPtr* CSingletonAutoPtr::GetInstance()
{
//begin lock
//....
if(m_instance == NULL)
m_instance = new CSingletonAutoPtr();
//end lock
//...
return m_instance;
}
void CSingletonAutoPtr::Test()
{
cout << "CSingletonAutoPtr::Test()" << endl;
}
//调用方法
CSingletonAutoPtr* pSingleton = CSingletonAutoPtr::GetInstance();
pSingleton->Test();
方法二:
//SingleStaticObj.h
class CSingletonStaticObj
{
private:
static CSingletonStaticObj m_instance;
protected:
CSingletonStaticObj();
CSingletonStaticObj(const CSingletonStaticObj&);
public:
virtual ~CSingletonStaticObj(); //must public
static CSingletonStaticObj& GetInstance();
void Test();
};
//SingleStaticObj.cpp
#include "SingletonStaticObj.h"
#include <string>
#include <iostream>
using namespace std;
CSingletonStaticObj CSingletonStaticObj::m_instance;
CSingletonStaticObj::CSingletonStaticObj()
{
cout << "CSingletonStaticObj::CSingletonStaticObj()" << endl;
}
CSingletonStaticObj::~CSingletonStaticObj()
{
cout << "CSingletonStaticObj::~CSingletonStaticObj()" << endl;
}
CSingletonStaticObj& CSingletonStaticObj::GetInstance()
{
return m_instance;
}
void CSingletonStaticObj::Test()
{
cout << "CSingletonStaticObj::Test()" << endl;
}
//调用方法
CSingletonStaticObj& singleton = CSingletonAutoPtr::GetInstance();
singleton.Test();