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

Message类与Folder类设计 示意图

C++ Primer (第四版) 13.4 消息处理示例_第1张图片


.h

#ifndef __C_MESSAGE__
#define __C_MESSAGE__
#include 
#include 
using namespace std;

class CMessage;
class Folder
{
public:
	Folder(){};
	//复制控制成员
	Folder( const Folder& );
	Folder& operator= ( const Folder& );
	~Folder();

	//在指定Message的目录集中增加/删除指定Message
	void save( CMessage & );
	void remove( CMessage & );

	//在该目录的消息集中增加/删除指定的Message
	void addMsg( CMessage * );
	void remMsg( CMessage * );

private:
	std::set message;	//该目录中的消息集
	//复制控制成员所使用的实用函数:
	//将目录加到形参所指的消息集中
	void put_Fldr_in_Messages( const std::set& );
	//从目录所指的所有消息中删除该目录
	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& );

	//在包含该消息的目录集中增加/删除指定Folder
	void addFldr( Folder* );
	void remFldr( Folder* ); 

private:
	std::string contents;		//实际消息文本
	std::set folders;	//包含该消息的目录

	//复制构造函数、赋值、析构函数所使用的实用函数:
	//将消息加到形参所指定的目录集中
	void put_Msg_in_Folders( const std::set& );
	//从消息所在的所有目录中删除该消息
	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 &rhs )
{
	for ( std::set::const_iterator beg = rhs.begin(); 
		beg != rhs.end(); ++beg )
	{
		(*beg)->addFldr(this);	//*beg指向一个消息
	}
}

void Folder::remove_Fldr_from_Messages()
{
	for ( std::set::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 &rhs )
{
	for ( std::set::const_iterator beg = rhs.begin(); 
			beg != rhs.end(); beg++ )
	{
		(*beg)->addMsg( this );
	}
}

//从对应的目录中删除该消息
void CMessage::remove_Msg_from_Folders()
{
	for ( std::set::const_iterator beg = folders.begin(); 
		beg != folders.end(); beg++ )
	{
		(*beg)->remMsg( this );
	}
}


你可能感兴趣的:(C++)