署理删除

代理删除
/********************************************************************
*  文件名:   Server.h
*  文件描述: 网络游戏模拟
*  创建人:   陈泽丹 ,2012年11月16日     
*  版本号:   1.0
*  修改记录:
********************************************************************/
#pragma once
#include <set>

using namespace std;

class Delete_Proxy
{
private:
	//代理项
	struct IDeleteSink
	{ 
		virtual ~IDeleteSink(){}
		virtual void delete_accessory() = 0;
	};
	//绑定附件
	template<class _T>
	struct Die:public IDeleteSink
	{
		Die(_T* _p_obj):mp_obj(_p_obj){}
		void delete_accessory(){ delete mp_obj; }
		_T* mp_obj;
	};
	map< const void*, IDeleteSink* > m_delete_objs;

	//删除相关附件
	void delete_accessorys()
	{
		for(map< const void*, IDeleteSink* >::iterator it = m_delete_objs.begin(); m_delete_objs.end() != it; ++it )
		{
			it->second->delete_accessory();
			delete it->second;
		}
		m_delete_objs.clear();
	}

public:
	virtual ~Delete_Proxy(){ delete_accessorys(); }

	//订阅"删除代理"
	template<class _T>
	void push(_T* _p_obj)
	{
		map< const void*, IDeleteSink* >::iterator it = m_delete_objs.find(_p_obj);
		if( m_delete_objs.end() == it )
			m_delete_objs[_p_obj] = new Die<_T>(_p_obj);
	}

	//取消"删除代理"
	template<class _T>
	void pop(const _T* _p_obj)
	{
		map< const void*, IDeleteSink* >::iterator it = m_delete_objs.find(_p_obj);
		if( m_delete_objs.end() != it )
		{
			delete it->second;
			m_delete_objs.erase(it);
		}
	}
};