《C++ Primer》 P415 消息处理机制 源代码

《C++ Primer》消息处理机制 源代码

#include <iostream>
#include <set>
#include <string>
class Message;
///
//类Folder
class Folder
{
public:
	Folder(){}
	Folder(const Folder&);
	~Folder();
	void save(Message&);
	void remove(Message&);
	void addMsg(Message*);
	void remMsg(Message*);
	Folder & operator=(const Folder &rhs);
private:
	std::set<Message*>messages;
	void put_Fldr_in_Messages(const std::set<Message*>&);
	void remove_Fldr_from_Messages();
};
//
//类Message
class Message
{
public:
	Message(const std::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:
	std::string contents;
	std::set<Folder*> folders;
	void put_Msg_in_Folders(const std::set<Folder*>&);
	void remove_Msg_from_Folders();
};
//
//类Folder实现部分
Folder::Folder(const Folder &f):messages(f.messages)
{
	put_Fldr_in_Messages(messages);
}
void Folder::put_Fldr_in_Messages(const std::set<Message*> &rhs)
{
	for(std::set<Message*>::const_iterator beg = rhs.begin();beg != rhs.end();++beg)
	{
		(*beg)->addFldr(this);
	}
}
Folder & Folder::operator=(const Folder &rhs)
{
	if (&rhs != this)
	{
		remove_Fldr_from_Messages(); //这里一定要移除message,因为如果只是覆盖的话,你并不知道对方的长度是不是和你的一样
		messages = rhs.messages;
		put_Fldr_in_Messages(rhs.messages);
	}
	return *this;
}
void Folder::remove_Fldr_from_Messages()
{
	for (std::set<Message*>::const_iterator beg = messages.begin();beg != messages.end();++beg)
	{
		(*beg)->remFldr(this);
	}
}
Folder::~Folder()
{
	remove_Fldr_from_Messages();
}
void Folder::save(Message& msg)
{
	addMsg(&msg);
	msg.addFldr(this);
}
void Folder::remove(Message& msg)
{
	remMsg(&msg);
	msg.remFldr(this);
}
void Folder::addMsg(Message* msg)
{
	messages.insert(msg);
}
void Folder::remMsg(Message* msg)
{
	messages.erase(msg);
}
//
//类Message实现部分
Message::Message(const Message &m):contents(m.contents),folders(m.folders)
{
	put_Msg_in_Folders(folders);
}
void Message::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);
	}
}
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;
}
void Message::remove_Msg_from_Folders()
{
	for (std::set<Folder*>::const_iterator beg =
		folders.begin(); beg != folders.end(); ++ beg)
	{
		(*beg)->remMsg(this);
	}
}
Message::~Message()
{
	remove_Msg_from_Folders();
}
void Message::save(Folder& fldr)
{
	addFldr(&fldr);
	fldr.addMsg(this);
}
void Message::remove(Folder& fldr)
{
	remFldr(&fldr);
	fldr.remMsg(this);
}
void Message::addFldr(Folder* fldr)
{
	folders.insert(fldr);
}
void Message::remFldr(Folder* fldr)
{
	folders.erase(fldr);
}


int main()
{
    Message  msg1("new message !"); 
    Folder fldr1;
	msg1.save(fldr1) ;
    
    
	return 0;
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值