代理删除

2014-11-24 09:11:27 · 作者: · 浏览: 0

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

using namespace std;

class Delete_Proxy
{
private:
//代理项
struct IDeleteSink
{
virtual ~IDeleteSink(){}
virtual void delete_accessory() = 0;
};
//绑定附件
template
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
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
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);
}
}
};