h
#ifndef TEST_H
#define TEST_H
#include <set>
using namespace std;
class Folder;
class Message {
friend class Folder;
friend void swap(Message&, Message&);
public:
explicit Message(const string& str = "") :
contents(str) {}
Message(const Message&);
Message& operator=(const Message&);
~Message();
void save(Folder&);
void remove(Folder&);
void addfol(Folder*);
void remfol(Folder*);
void print();
void test();
private:
string contents;
set<Folder*> folders;
void add_to_Folders(const Message&);
void remove_from_Folders();
};
class Folder {
friend class Message;
friend void swap(Message&, Message&);
public:
Folder() = default;
Folder(const Folder& f);
Folder& operator=(const Folder&);
~Folder();
void addMsg(Message*);
void remMsg(Message*);
void print();
private:
set<Message*> messages;
void add_to_Messages(const Folder&);
void remove_from_Messages();
};
#endif
cpp
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include"test.h"
using namespace std;
//函数定义
void swap(Message& lhs, Message& rhs)
{
using std::swap;
//移除保存双方的Folder的记录
for (auto f : lhs.folders)
f->remMsg(&lhs);
for (auto f : lhs.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);
}
void Folder::print()
{
cout << "Messages:";
for (auto m : messages)
{
cout << " " << m->contents;
}
cout << endl;
}
void Message::print()
{
cout << "Save in " << folders.size() << " Folders" << endl;
}
void Message::test()
{
Folder f1;
folders.insert(&f1);
}
//Message定义
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) //保存到指定Folder中
{
addfol(&f); //更新自身的Folders目录
f.addMsg(this); //向Folder中添加自身
}
void Message::remove(Folder& f) //从指定Folder中移除
{
remfol(&f);
f.remMsg(this);
}
void Message::addfol(Folder* f)
{
folders.insert(f);
}
void Message::remfol(Folder* f)
{
folders.erase(f);
}
void Message::add_to_Folders(const Message& m) //拷贝构造以及拷贝赋值中均需此操作
{
for (auto f : m.folders) //对于每个保存m的Folder
f->addMsg(this); //向其中添加Message自身
}
void Message::remove_from_Folders() //清空保存自身的Folders
{
for (auto f : folders)
f->remMsg(this);
}
//Folder定义
Folder::Folder(const Folder& f) :
messages(f.messages)
{
add_to_Messages(f);
}
Folder& Folder::operator=(const Folder& f)
{
remove_from_Messages();
messages = f.messages;
add_to_Messages(f);
return *this;
}
Folder::~Folder()
{
remove_from_Messages();
}
void Folder::addMsg(Message* m) //添加单个Message元素
{
messages.insert(m);
}
void Folder::remMsg(Message* m) //同上
{
messages.erase(m);
}
void Folder::add_to_Messages(const Folder& f)
{
for (auto m : f.messages) //对于目录中的每一条Message进行单次操作
m->addfol(this); //此处切勿使用save!因为会被save中的f.addMsg(this)循环调用自身
//下方remove同理
}
void Folder::remove_from_Messages() //清空目录中保存的Message
{
for (auto m : messages)
m->remfol(this);
}
int main()
{
Message m1("Hello");
Message m2("World");
Folder f1;
m1.save(f1);
m2.save(f1);
f1.print();
m1.print();
return 0;
}