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);
}
}