c++ primer 訊息處理示例+課後習題完成

jsjliuyun發表於2014-05-13

       最近又重新瀏覽了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);
}


相關文章