程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 代理刪除

代理刪除

編輯:C++入門知識

 [cpp]
/********************************************************************
*  文件名:   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); 
        } 
    } 
}; 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved