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