C++ Primer (第四版) 13.4 消息处理示例

来源:互联网 发布:mac找回删除的文件 编辑:程序博客网 时间:2024/06/10 09:59

Message类与Folder类设计 示意图



.h

#ifndef __C_MESSAGE__#define __C_MESSAGE__#include <string>#include <set>using namespace std;class CMessage;class Folder{public:Folder(){};//复制控制成员Folder( const Folder& );Folder& operator= ( const Folder& );~Folder();//在指定Message的目录集中增加/删除指定Messagevoid save( CMessage & );void remove( CMessage & );//在该目录的消息集中增加/删除指定的Messagevoid addMsg( CMessage * );void remMsg( CMessage * );private:std::set<CMessage*> message;//该目录中的消息集//复制控制成员所使用的实用函数://将目录加到形参所指的消息集中void put_Fldr_in_Messages( const std::set<CMessage*>& );//从目录所指的所有消息中删除该目录void remove_Fldr_from_Messages();};class CMessage{public://folders自动初始化为空集CMessage( const std::string &str = "" ) : contents(str) { }//复制控制成员CMessage( const CMessage& );CMessage& operator= ( const CMessage& );~CMessage(void);//在指定的Folder的消息集中增加/删除该消息void save( Folder& );void remove( Folder& );//在包含该消息的目录集中增加/删除指定Foldervoid addFldr( Folder* );void remFldr( Folder* ); private:std::string contents;//实际消息文本std::set<Folder*> folders;//包含该消息的目录//复制构造函数、赋值、析构函数所使用的实用函数://将消息加到形参所指定的目录集中void put_Msg_in_Folders( const std::set<Folder*>& );//从消息所在的所有目录中删除该消息void remove_Msg_from_Folders();};#endif //__C_MESSAGE__


.cpp

#include "stdafx.h"#include "Message.h"Folder::Folder( const Folder& f ) : message(f.message){//将该目录加到f所指向的每个消息中put_Fldr_in_Messages(message);}Folder& Folder::operator=( const Folder& rhs ){if( &rhs != this ){remove_Fldr_from_Messages();//更新现有消息message = rhs.message;//从rhs复制消息指针集put_Fldr_in_Messages(rhs.message);//将该目录加到rhs中的每个消息中}return *this;}Folder::~Folder(){remove_Fldr_from_Messages();}void Folder::save( CMessage &msg ){addMsg( &msg );msg.addFldr(this);//更新现有消息}void Folder::remove( CMessage &msg ){remMsg( &msg );msg.remFldr(this);//更新现有消息}void Folder::addMsg( CMessage *msg ){message.insert( msg );}void Folder::remMsg( CMessage *msg ){message.erase( msg );}void Folder::put_Fldr_in_Messages( const std::set<CMessage*> &rhs ){for ( std::set<CMessage*>::const_iterator beg = rhs.begin(); beg != rhs.end(); ++beg ){(*beg)->addFldr(this);//*beg指向一个消息}}void Folder::remove_Fldr_from_Messages(){for ( std::set<CMessage*>::const_iterator beg = message.begin(); beg != message.end(); ++beg ){(*beg)->remFldr(this);//*beg指向一个消息}}CMessage::CMessage( const CMessage &m ) :contents(m.contents),folders(m.folders){put_Msg_in_Folders( folders );//将该消息加到指向m的每个目录中}CMessage& CMessage::operator= ( const CMessage &rhs ){if( &rhs != this ){remove_Msg_from_Folders();contents = rhs.contents;//从rhs复制消息内容folders = rhs.folders;//从rhs复制目录指针集put_Msg_in_Folders( rhs.folders );//将该消息加到rhs中的每个目录中}return *this;} CMessage::~CMessage( void ){remove_Msg_from_Folders();}void CMessage::save( Folder &fldr ){addFldr( &fldr );fldr.addMsg( this );}void CMessage::remove( Folder &fldr ){remFldr( &fldr );fldr.remMsg( this ); }void CMessage::addFldr( Folder *fldr ){folders.insert( fldr );}void CMessage::remFldr( Folder *fldr ){folders.erase( fldr );}//将该消息加到rhs所指向的每个目录集中void CMessage::put_Msg_in_Folders( const std::set<Folder*> &rhs ){for ( std::set<Folder *>::const_iterator beg = rhs.begin(); beg != rhs.end(); beg++ ){(*beg)->addMsg( this );}}//从对应的目录中删除该消息void CMessage::remove_Msg_from_Folders(){for ( std::set<Folder *>::const_iterator beg = folders.begin(); beg != folders.end(); beg++ ){(*beg)->remMsg( this );}}


0 0
原创粉丝点击