#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();
本文介绍了两种实现单例模式的方法,一种使用auto_ptr确保单例对象的唯一性和正确释放,另一种利用静态局部变量特性实现线程安全的单例模式。通过具体代码示例展示了每种方法的特点。


被折叠的 条评论
为什么被折叠?



