C++ //练习 13.36 设计并实现对应的Folder类。此类应该保存一个指向Folder中包含的Message的set。

发布于:2024-04-26 ⋅ 阅读:(29) ⋅ 点赞:(0)

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

网站公告

今日签到

点亮在社区的每一天
去签到