首页 > 代码库 > c++ primer 消息处理示例+课后习题完成

c++ primer 消息处理示例+课后习题完成

       最近又重新浏览了c++ primer , 感觉以前看的太浅显了,所以抽空又翻了翻,感觉里面很多的知识还是不是熟悉,正好今天看到复制控制这章的例题--消息处理示例,同时也把课后习题要求了顺带完成了。

       贴一下代码,供大家参考,相互学习哈!

//Msg类
#ifndef MSG_H
#define MSG_H
#include "Folder.h"
#include <set>
#include <string>
using std::string;
using std::set;
class Msg
{
    //定义友元类
	friend class Folder;
public:
	//构造函数
	Msg(const string &str=""):content(str){}
	//复制构造函数
	Msg(const Msg&);
	//复制操作符
	Msg& operator=(const Msg&);
	~Msg();
	void save(Folder&);
	void remove(Folder&);
private:
	string content;
	set<Folder*> folders;
	//添加指向当前Msg对象的指针到Folder中
	void put_Msg_in_Folders(const set<Folder*>&);
	void remove_Msg_from_Folders();
	//当前的Msg对象添加/删除指向Folder的指针
	void addFldr(Folder*);
	void removeFldr(Folder*);
};
#endif

#include "Msg.h"
//复制构造函数
Msg::Msg(const Msg &m)
{
	//将Msg的成员进行赋值
	this->content = m.content;
	this->folders = m.folders;
	//将这个Msg添加到m所在的Folder中去
	put_Msg_in_Folders(this->folders);
}
void Msg::put_Msg_in_Folders(const set<Folder*> &rhs)
{
	for(set<Folder*>::const_iterator beg = rhs.begin();beg!=rhs.end();++beg)
		//将当前的Msg对象添加到每个Folder中
		(*beg)->addMsg(this);
}
Msg& Msg::operator=(const Msg &rhs)
{
	if(this != &rhs)
	{
		//将当前左边的Msg从它所在的Folder中全部移除
		remove_Msg_from_Folders();
		this->content=rhs.content;
		this->folders=rhs.folders;
		put_Msg_in_Folders(this->folders);
	}
	return *this;
}
void Msg::remove_Msg_from_Folders()
{
	for(set<Folder*>::const_iterator beg=folders.begin();beg!=folders.end();++beg)
	{
		(*beg)->removeMsg(this);
	}
}
Msg::~Msg(void)
{
	remove_Msg_from_Folders();
}

void Msg::addFldr(Folder *folder)
{
	folders.insert(folder);
}

void Msg::removeFldr(Folder *folder)
{
	folders.erase(folder);
}

void Msg::save(Folder &folder)
{
	//更新Msg对象中指向Folder指针集
	folders.insert(&folder);
	//更新Folder中指向Msg指针集
	folder.addMsg(this);
}

void Msg::remove(Folder &folder)
{
	//更新Msg对象中指向Folder指针集
	folders.erase(&folder);
	//更新Folder中指向Msg指针集
	folder.removeMsg(this);
}

//Folder类
#ifndef FOLDER_H
#define FOLDER_H
#include "Msg.h"
#include <set>
using std::set;
class Folder
{
	friend class Msg;
public:
	Folder();
	//复制构造函数
	Folder(const Folder&);
	Folder& operator=(const Folder&);
	~Folder();
	void save(Msg&);
	void remove(Msg&);
private:
	set<Msg*> messages;
	//复制mesages
	void copy_msg(const set<Msg*>&);
	void empty_msg();
	void addMsg(Msg*);
	void removeMsg(Msg*);
};
#endif

#include "Folder.h"
//Folder类的构造函数
Folder::Folder()
{
}

//Folder的复制构造函数,调用copy_msg()来复制f中指向Msg对象的指针
Folder::Folder(const Folder &f)
{
	copy_msg(f.messages);
}

//赋值操作符,先判断左右操作数是否相同,如果不同的话则清空左边Folder对象中指向Msg对象的指针
//并将右边rhs对象中指向Msg对象的指针复制给左边的对象
//最后返回*this
Folder& Folder::operator=(const Folder &rhs)
{
	if(this != &rhs)
	{
		empty_msg();
		this->copy_msg(rhs.messages);
	}
	return *this;
}
//Folder析构函数,清空Folder对象中所有的指向Msg对象的指针
Folder::~Folder()
{
	empty_msg();
}

//清空Folder对象中指向Msg对象的指针
//清空Folder对象指向Msg对象中指向Folder的指针
void Folder::empty_msg()
{
	//移除当前Folder中所有的指向Msg对象的指针
	for(set<Msg*>::iterator beg=messages.begin();beg!=messages.end();++beg)
	{
		//调用Msg类中的成员函数remove()来实现
		(*beg)->remove(*this);
	}
}

//复制操作
void Folder::copy_msg(const set<Msg*> &messages)
{
	for(set<Msg*>::const_iterator beg=messages.begin();beg!=messages.end();++beg)
	{
		//调用Msg类中的save操作来实现
		(*beg)->save(*this);
	}
}

//添加到当前Folder对象中指向Msg对象的指针集
void Folder::addMsg(Msg *msg)
{
	messages.insert(msg);
}

void Folder::removeMsg(Msg *msg)
{
	messages.erase(msg);
}

void Folder::save(Msg &msg)
{
	messages.insert(&msg);
	msg.addFldr(this);
}

void Folder::remove(Msg &msg)
{
	messages.erase(&msg);
	msg.removeFldr(this);
}