singleton pattern的一个模板实现, 适用于单线程

</pre><pre code_snippet_id="384326" snippet_file_name="blog_20140609_1_6941024" name="code" class="cpp">

/**
*    \file               singleton.h
*    \date               06-09-2014
*    \author             GaoYang
*    \brief              singleton pattern的一个模板实现, 适用于单线程.
*    \par Revision History(No.->date->by->actions)  
*    \par
*    #001....06-09-2014....GaoYang....
*/


#pragma once

#include <memory>

using namespace std;

#define DECLARE_SINGLETON_CLASS(type)	\
	friend class auto_ptr<type>;		\
	friend class CSingleton<type>;		\
protected:								\
	type(void);							\
	virtual ~type(void);				\
	type(const type&){}			\
public:

template<class T>
class CSingleton
{
	friend class auto_ptr<CSingleton>;

public:
	static T* Instance();

protected:
	CSingleton()
	{
	}

	virtual ~CSingleton()
	{
	}

private:
	CSingleton(const CSingleton&)
	{
	}

    static auto_ptr<T> m_pInstance;
};


template <class T>
auto_ptr<T> CSingleton<T>::m_pInstance;


template<class T>
inline T* CSingleton<T>::Instance()
{
	// if (NULL == m_pInstance.get())
	{
		// lock here
		if (NULL == m_pInstance.get())
		{
			m_pInstance.reset(::new T);
		}
		// unlock here
	}

	return m_pInstance.get();
}


class MyClass : public CSingleton<MyClass>
{
	DECLARE_SINGLETON_CLASS(MyClass)
public:
	void f();
private:

};

int _tmain(int argc, _TCHAR* argv[])
{
	MyClass *p = MyClass::Instance();
	p->f;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值