#include <iostream>
#include <vector>
#include <string>
#include <set>
using namespace std;
class Message;
class Folder
{
friend class Message;
private:
set<Message*> msgs;//该文件夹中所含的信息
public:
//构造函数
Folder():msgs(set<Message*>()){}
Folder( Message &);
//向该文件夹添加、删除信息
void addMsg(Message *m);
void remMsg(Message *m);
Folder(const Folder&);//
~Folder();
Folder& operator=(const Folder &rhs);
void print_f_size()
{
cout<<"该文件夹中包含的消息个数为: "<<msgs.size()<<endl;
}
};
class Message
{ friend class Folder;//声明文件夹类为友元类,可以访问Message中的内容
private:
string contents;
set<Folder*> folders;//包含该消息的所有文件夹
public:
//构造函数
Message(const string &m):contents(m),folders(set<Folder*>()){}//未指定文件夹
Message(const string &m,Folder &f);//指定文件夹
//功能函数
void save(Folder *);
void remove(Folder *);
//拷贝构造函数
Message(const Message&);
Message& operator=(const Message &rhs);
void print_m_size()
{
cout<<"存有该消息的文件夹个数为: "<<folders.size()<<endl;
}
};
Message::Message(const string &m,Folder &f):contents(m){
folders.insert(&f);
f.msgs.insert(this);
}
Folder::Folder( Message &m)
{
msgs.insert(&m);
m.folders.insert(this);
}
Message::Message(const Message &m)
{
contents=m.contents;//消息内容的拷贝
folders=m.folders;//存有该消息的文档的拷贝
for(auto f:folders)//Folder*
{
f->msgs.insert(this);//更新保存了该消息的文件夹
}
}
Message& Message::operator=(const Message &rhs)
{
contents=rhs.contents;
folders=rhs.folders;
for(auto f:folders)
{
f->msgs.insert(this);//更新保存了该消息的文件夹
}
return *this;
}
void Message::save(Folder *f)
{
folders.insert(f);
f->msgs.insert(this);
}
void Message::remove(Folder *f)
{
folders.erase(f);
f->msgs.erase(this);
}
void Folder::addMsg(Message* m)
{
msgs.insert(m);//消息插入msgs set
//m->folders.insert(this);//更新包含该消息的set
}
void Folder::remMsg(Message *m)
{
msgs.erase(m);
//m->folders.erase(this);
}
Folder::Folder(const Folder& f)
{
msgs=f.msgs;
//更新f文件夹中所有消息的文件夹信息
for(auto m:f.msgs)
{
m->folders.insert(this);//每条消息添加新的文件夹
}
}
Folder::~Folder()
{
for(auto m:msgs)//遍历本文件夹中的消息set
{
m->folders.erase(this); //修改消息对象中的文件夹成员
}
}
Folder& Folder::operator=(const Folder &rhs)
{
//该文件中本来的消息所对应的消息的文件夹修改
for(auto m:msgs)
{
m->folders.erase(this);
}
msgs=rhs.msgs;
//给rhs文件夹中的消息添加新的文件夹信息
for(auto m:rhs.msgs)
{
m->folders.insert(this);//this是Folder
}
return *this;
}
int main(int argc, char *argv[])
{
Folder f1,f2;
Message m1("heloo asd");
Message m2("this is f2",f2);
Message m3("o;k;m");
m2.print_m_size();//1
f2.print_f_size();//1 ??
f1.print_f_size();
m3.save(&f2);
f2.print_f_size();//2
return 0;
}