c++primer13.4消息和文件夹
#include <iostream> #include <vector> #include <string> #include <set> using namespace std; class Message; class Folder { friend class Message; private: set<Message*> msgs;//该文件夹中所含的信息 public: //构造函数 Folder():msgs(set<Message*>()){} Folder( Message &); //向该文件夹添加、删除信息 void addMsg(Message *m); void remMsg(Message *m); Folder(const Folder&);// ~Folder(); Folder& operator=(const Folder &rhs); void print_f_size() { cout<<"该文件夹中包含的消息个数为: "<<msgs.size()<<endl; } }; class Message { friend class Folder;//声明文件夹类为友元类,可以访问Message中的内容 private: string contents; set<Folder*> folders;//包含该消息的所有文件夹 public: //构造函数 Message(const string &m):contents(m),folders(set<Folder*>()){}//未指定文件夹 Message(const string &m,Folder &f);//指定文件夹 //功能函数 void save(Folder *); void remove(Folder *); //拷贝构造函数 Message(const Message&); Message& operator=(const Message &rhs); void print_m_size() { cout<<"存有该消息的文件夹个数为: "<<folders.size()<<endl; } }; Message::Message(const string &m,Folder &f):contents(m){ folders.insert(&f); f.msgs.insert(this); } Folder::Folder( Message &m) { msgs.insert(&m); m.folders.insert(this); } Message::Message(const Message &m) { contents=m.contents;//消息内容的拷贝 folders=m.folders;//存有该消息的文档的拷贝 for(auto f:folders)//Folder* { f->msgs.insert(this);//更新保存了该消息的文件夹 } } Message& Message::operator=(const Message &rhs) { contents=rhs.contents; folders=rhs.folders; for(auto f:folders) { f->msgs.insert(this);//更新保存了该消息的文件夹 } return *this; } void Message::save(Folder *f) { folders.insert(f); f->msgs.insert(this); } void Message::remove(Folder *f) { folders.erase(f); f->msgs.erase(this); } void Folder::addMsg(Message* m) { msgs.insert(m);//消息插入msgs set //m->folders.insert(this);//更新包含该消息的set } void Folder::remMsg(Message *m) { msgs.erase(m); //m->folders.erase(this); } Folder::Folder(const Folder& f) { msgs=f.msgs; //更新f文件夹中所有消息的文件夹信息 for(auto m:f.msgs) { m->folders.insert(this);//每条消息添加新的文件夹 } } Folder::~Folder() { for(auto m:msgs)//遍历本文件夹中的消息set { m->folders.erase(this); //修改消息对象中的文件夹成员 } } Folder& Folder::operator=(const Folder &rhs) { //该文件中本来的消息所对应的消息的文件夹修改 for(auto m:msgs) { m->folders.erase(this); } msgs=rhs.msgs; //给rhs文件夹中的消息添加新的文件夹信息 for(auto m:rhs.msgs) { m->folders.insert(this);//this是Folder } return *this; } int main(int argc, char *argv[]) { Folder f1,f2; Message m1("heloo asd"); Message m2("this is f2",f2); Message m3("o;k;m"); m2.print_m_size();//1 f2.print_f_size();//1 ?? f1.print_f_size(); m3.save(&f2); f2.print_f_size();//2 return 0; }