C++primer message代码

#include <iostream>
#include <string>
#include <set>
using namespace std;
class Message;  //<需要先声明,才能在Folder中使用
class Folder
{
 Folder(){};
 ~Folder();
 void addMsg(Message *);
 void remMsg(Message *);
private:
 set<Message *> messages;
 void remove_Fldr_form_Messages();
};
class Message
{
public:
 Message (const string &str = ""):contents(str){};   //<复制构造函数,初始化列表
 Message (const Message &); //<构造函数
 Message &operator= (const Message &); //<赋值操作符
 ~Message();
 void save(Folder &);
 void remove(Folder &);
 void addFldr(Folder *);
 void remFldr(Folder *);
private:
 string contents;
 set<Folder *> folders;
 void put_Msg_in_Folders(const set<Folder *> &rhs);//自身Message的一个副本添加到指向给定Message的各Folder中
 void remove_Msg_from_Folders();//从folders成员的每个Folder中删除指向这个Message的指针
};
void Message::save(Folder &f)
{
 folders.insert(&f);//<更新message对应目录
 f.addMsg(this);    //<增加目录中对应的此条目录
}
void Message::remove(Folder &f)
{
 folders.erase(&f); //<删除此消息对应的这个目录 ,folders是这条消息对应的目录集合
 f.remMsg(this);    //<删除这个目录中对应的此条内容
}
void Message::addFldr(Folder *f)
{
 folders.insert(f);
}
void Message::remFldr(Folder *f)
{
 folders.erase(f);
}
void Message::put_Msg_in_Folders(const set<Folder *> &rhs)
{
 for (set<Folder *>::const_iterator beg = rhs.begin(); beg != rhs.end(); ++beg)
 {
  (*beg)->addMsg(this); //<在对应的目录中加入这条消息
 }
}
void Message::remove_Msg_from_Folders() //<在对饮目录中删除这条消息
{
 for (set<Folder *>::const_iterator beg = folders.begin(); beg != folders.end(); ++beg)
 {
  (*beg)->remMsg(this);
 }
}
/************************************************************************/
/* 赋值时需删除左操作数,并在撤销左操作数的成员之后,
将右操作数的成员赋值给左操作数的相应成员。
如果对象是相同的,则撤销左操作数的成员也将撤销右操作数的成员!                                                                     */
/************************************************************************/
Message& Message::operator=(const Message &rhs)
{
 if (&rhs != this)
 {
  remove_Msg_from_Folders();
  contents = rhs.contents;
  folders = rhs.folders;
  put_Msg_in_Folders(rhs.folders);
 }
 return * this;
}
/************************************************************************/
/* 系统自动调用string析构函数释放contents,
自动调用set析构函数清除用于保存folders成员的内存,
因此,Message析构函数唯一要做的是调用remove_Msg_from_Folders                                                                     */
/************************************************************************/
Message:: ~Message()
{
 remove_Msg_from_Folders();
}
//------------------------------------------------------------------------------------------
Folder::~Folder()
{
 remove_Fldr_form_Messages();
}
void Folder::addMsg(Message *rhs)
{
 messages.insert(rhs);
}
void Folder::remMsg(Message *rhs)
{
 messages.erase(rhs);
}
void Folder::remove_Fldr_form_Messages() 

 for (std::set<Message *>::const_iterator beg = messages.begin(); 
  beg != messages.end(); ++beg) 
 { 
  (*beg) -> remFldr(this); 
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值