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