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的目录集中增加/删除指定Message
void save( CMessage & );
void remove( CMessage & );
//在该目录的消息集中增加/删除指定的Message
void 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& );
//在包含该消息的目录集中增加/删除指定Folder
void 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 );
}
}