Skip to content

Latest commit

 

History

History
171 lines (151 loc) · 5.44 KB

File metadata and controls

171 lines (151 loc) · 5.44 KB
#include <iostream>
using std::cin; using std::cout; using std::endl; using std::cerr;
#include <string>
using std::string;
#include <set>
using std::set;

class Folder;
class Message {
    friend class Folder;
    friend void swap(Message &, Message &);
public:
    //folders被隐式初始化为空set
    explicit Message(const string &str = "") :
        contents(str) {};
    //拷贝控制成员,用来管理指向本Message的指针
    Message(const Message &);       //拷贝构造函数
    Message &operator=(const Message &);    //拷贝赋值运算符
    ~Message();     //析构函数
    //从给定Folder集合中添加/删除本Message
    void save(Folder&);
    void remove(Folder&);
private:
    string contents;        //实际消息文本
    set<Folder *> folders;  //包含本Message的Folder
    //拷贝构造函数、拷贝赋值运算符和析构函数所使用的工具函数
    //将本Message添加到指向参数的Folder中
    void add_to_Folders(const Message &);
    //从folders中的每个Folder中删除本Message
    void remove_from_Folders();
};

class Folder{
    friend class Message;
    friend void swap(Message &, Message &);
    friend void swap(Folder &, Folder &);
public:
    Folder() = default;
    //拷贝控制成员,用来管理指向本Folder的指针
    Folder(const Folder &);     //拷贝构造函数
    Folder &operator=(const Folder &);      //拷贝赋值运算符
    ~Folder();      //析构函数
    void save(Message *);
    void remove(Message *);
private:
    set<Message *> messages;
    //在给定Folder对象的消息集合中添加/删除元素
    void addMsg(Message *);
    void remMsg(Message *);
};

void Message::save(Folder &f) {
    folders.insert(&f);     //将给定Folder添加到我们的Folder列表中
    f.addMsg(this);         //将本Message添加到f的Message集合中
}

void Message::remove(Folder &f) {
    folders.erase(&f);      //将给定Folder从我们的Folder列表中删除
    f.remMsg(this);         //将本Message从f的Message集合中删除
}

//将本Message添加到指向m的Folder中
void Message::add_to_Folders(const Message &m) {
    for (auto f : m.folders)    //对每个包含m的Folder
        f->addMsg(this);        //向该Folder添加一个指向本Message的指针
}

Message::Message(const Message &m) :
    contents(m.contents), folders(m.folders){
    add_to_Folders(m);          //将本消息添加到指向m的Folder中
}

//从对应的Folder中删除本Message
void Message::remove_from_Folders() {
    for (auto f : folders)      //对folders中每个指针
        f->remMsg(this);        //从该Folder中删除本Message
}

Message::~Message() {
    remove_from_Folders();
}

Message &
Message::operator=(const Message &rhs) {
    //通过先删除指针再插入他们来处理自赋值情况
    remove_from_Folders();  //更新已有Folder
    contents = rhs.contents;    //从rhs拷贝消息内容
    folders = rhs.folders;      //从rhs拷贝Folder指针
    add_to_Folders(rhs);        //将本Message添加到那些Folder中
    return *this;
}

void swap(Message &lhs, Message &rhs){
    using std::swap;
    //将每个消息的指针从它(原来)所在Folder中删除
    for (auto f : lhs.folders)
        f->remMsg(&lhs);
    for (auto f : rhs.folders)
        f->remMsg(&rhs);
    //交换contents和Folder指针set
    swap(lhs.folders, rhs.folders);     //使用swap(set&, set&)
    swap(lhs.contents, rhs.contents);   //使用swap(string&, string&)
    //将每个Message的指针添加到它的(新)Folder中
    for (auto f : lhs.folders)
        f->addMsg(&lhs);
    for (auto f : rhs.folders)
        f->addMsg(&rhs);
}

//Folder的拷贝控制函数,不仅需要将该folder下所含的消息拷贝
//还需要更新每条消息的set<Folder *>,将新Folder对象添加到每一条消息,
Folder::Folder(const Folder &f) : messages(f.messages){
    for (auto &mm : messages)   //对包含的每条消息
        mm->folders.insert(this);   //
}

//Folder的拷贝赋值运算符
Folder &
Folder::operator=(const Folder &rhs) {
    //通过先删除指针再插入处理自赋值情况
    for (auto &mm : messages)   //对messages中的每个指针
        mm->folders.erase(this);    //从该Message的folders中删除本Folder
    messages = rhs.messages;    //从rhs中拷贝Message *指针(即所有条的消息)
    for (auto &mm : messages)   //对messages中的每个指针
        mm->folders.insert(this);   //将本Folder添加到所有的Message的folders中
    return *this;
}

//Folder的析构函数
Folder::~Folder() {
    for (auto &mm : messages)   //对messages中的每个指针
        mm->folders.erase(this);    //从该Message的folders中删除本Folder
}

void Folder::addMsg(Message *m) {
    m->folders.insert(this);
}

void Folder::remMsg(Message *m) {
    m->folders.erase(this);
}

void Folder::save(Message *m) {
    messages.insert(m);
    m->folders.insert(this);
}

void Folder::remove(Message *m) {
    messages.erase(m);
    m->folders.erase(this);
}

void swap(Folder &lhs, Folder &rhs) {
    using std::swap;
    //将每个目录的指针从它(原来)所包含的Message中删除
    for (auto &mm : lhs.messages)
        mm->remove(lhs);
    for (auto &mm : rhs.messages)
        mm->remove(rhs);
    swap(lhs.messages, rhs.messages);
    //将每个目录添加到每一条新的Message中
    for (auto &mm : lhs.messages)
        mm->save(lhs);
    for (auto &mm : rhs.messages)
        mm->save(rhs);
}

int main(){}