设计模式---单件(C++版) 一个简单实例(避免用户忘记delete单件实例)

来源:互联网 发布:淘宝儿童女装秋装 编辑:程序博客网 时间:2024/04/24 09:01

 上次提供的代码没有考虑到客户忘记delete这一点;所以在网上看了一些别人的代码,整理了一下发了上来!

 

#include <memory>
#include 
<string>
#include 
<iostream>
using namespace std;
/* 
#include <memory>
auto_ptr是可以避免忘记delete如下
auto_ptr<Int> pi ( new Int( 5 ) );
cout << pi->x << endl;
*/


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();
}
;

CSingletonAutoPtr
* CSingletonAutoPtr::m_instance = NULL;
auto_ptr
<CSingletonAutoPtr> CSingletonAutoPtr::m_auto_ptr;
CSingletonAutoPtr::CSingletonAutoPtr()
{
    cout 
<< "CSingletonAutoPtr::CSingletonAutoPtr()" << endl;
    m_auto_ptr 
= auto_ptr<CSingletonAutoPtr>(this);
}

CSingletonAutoPtr::
~CSingletonAutoPtr()
{
    cout 
<< "CSingletonAutoPtr::~CSingletonAutoPtr()" << endl;
}

CSingletonAutoPtr
* CSingletonAutoPtr::GetInstance()
{
   
    
if(m_instance == NULL)
        m_instance 
= new CSingletonAutoPtr();
   
return m_instance;
}

void CSingletonAutoPtr::Test()
{
    cout 
<< "CSingletonAutoPtr::Test()" << endl;
}

class CSingletonStaticObj 
{
private:
    
static CSingletonStaticObj m_instance;
protected:
    CSingletonStaticObj();
    CSingletonStaticObj(
const CSingletonStaticObj&);
public:
    
virtual ~CSingletonStaticObj(); //must public
    static CSingletonStaticObj& GetInstance();
    
void Test();
}


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;
}


 
int main()
{
    CSingletonAutoPtr
* pSingleton = CSingletonAutoPtr::GetInstance();
    pSingleton
->Test(); 
    CSingletonStaticObj
& singleton = CSingletonStaticObj::GetInstance();
    singleton.Test() ;
    
return 0;
}
原创粉丝点击