C++ Primer(第5版) 练习 13.36
练习 13.36 设计并实现对应的Folder类。此类应该保存一个指向Folder中包含的Message的set。
环境:Linux Ubuntu(云服务器)
工具:vim
代码块
/*************************************************************************> File Name: ex13.36.cpp> Author: > Mail: > Created Time: Thu 25 Apr 2024 09:28:32 AM CST************************************************************************/#include<iostream>
using namespace std;class Folder;class Messsage{friend class Folder;friend void swap(Message &lhs, Message &rhs);public:explicit Message(const string &str = ""): contents(str) {}Message(const Message &);Message &operator= (const Message &);~Message();void save(Folder &);void remove(Folder &);private:string contents;set<Folder*> folders;void addFolder(Folder *);void remFolder(Folder *);void add_to_Folders(const Message &);void remove_from_Folders();
};Message::Message(const Message &m): contents(m.contents), folders(m.folders){add_to_Folders(m);
}Message &Message::operator= (const Message &rhs){remove_from_Folders();contents = rhs.contents;folders = rhs.folders;add_to_Folders(rhs);return *this;
}Message::~Message(){remove_from_Folders();
}void Message::save(Folder &f){folders.insert(&f);f.addMsg(this);
}void Message::remove(Folder &f){folders.erase(&f);f.remMsg(this);
}void Message::addFolder(Folder *f){folders.insert(f);
}void Message::remFolder(Folder *f){folders.erase(f);
}void Message::add_to_Folders(const Message &m){for(auto f : m.folders){f->addMsg(this);}
}void Message::remove_from_Folders(){for(auto f : folders){f->remMsg(this);}
}void swap(Messsage &lhs, Messsage &rhs){using std::swap;for(auto f : lhs.folders){f->remMsg(&lhs);}for(auto f : rhs.folders){f->remMsg(&rhs);}swap(lhs.folders, rhs.folders);swap(lhs.contents, rhs.contents);for(auto f : lhs.folders){f->addMsg(&lhs);}for(auto f : rhs.folders){f->addMsg(&rhs);}
}class Folder{friend class Message;friend void swap(Message &, Message &);public:Folder() = default;Folder(const Folder &);Folder &operator= (const Folder &);~Folder();private:set<Message*> msgs;void addMsg(Message *);void remMsg(Message *);void add_to_Messages(const Folder &);void remove_to_Messages();
};Folder::Folder(const Folder &f){add_to_Messages(f);
}Folder& Folder::operator= (const Folder &f){remove_to_Messages();msgs = f.msgs;add_to_Messages(f);return *this;
}Folder::~Folder(){remove_to_Messages();
}void Folder::addMsg(Message *m){msgs.insert(m);
}void Folder::remMsg(Message *m){msgs.erase(m);
}void Folder::add_to_Messages(const Folder &f){for(auto m : f.msgs){m->addFolder(this);}
}void Folder::remove_from_Message(){for(auto m : msgs){m->remFolder(this);}
}