编写两个可能用于邮件处理的类,分别命名为Message和Folder,分别表示电子邮件消息和消息目录.
[1]每个Message对象可以出现在多个Folder目录中,但是任意给定的Message内容只有一个副本.如果一条Message的内容被改变,则从任何目录浏览次Message时都会看到改变后的内容.
[2]当拷贝一个Message对象时,副本和原对象将是不同的Message对象,但是它们必须出现在相同的Folder中.
[3]当销毁一个Message时,它将不复存在,同时所有包含此Message的Folder都将删除此Message指针.
[4]我们将一个Message赋值给另外一个时,左侧的对象将被右侧代替,处理相应的更新。注意要能处理自赋值的情况.
[5]编写相应的swap,这样Message将能提高效率.
[6]Folder类的操作与Message类似.
由于很多操作是重复的,在private部分编写相应的成员.
#include "iostream"
#include "fstream"
#include "sstream"
#include "string"
#include "vector"
#include "algorithm"
#include "memory"
#include "map"
#include "set"
using namespace std;
class Folder;
class Message
{
friend void swap(Message&, Message&);
friend class Folder;
public:
explicit Message(const string & s = string()) :contents(s){}//默认构造函数
//定义拷贝控制成员
Message(const Message &);//拷贝控制函数
Message& operator=(const Message&);
~Message(){ remove_from_Folders();}
void save(Folder &);
void remove(Folder&);
private:
string contents;
set<Folder*>Folders;
void add_to_Folders(const Message&);//将本message添加到由拷贝的Message指定的Folders
void remove_from_Folders();//从Folders中的每个Folder中删除本Message
void addFldr(Folder* f) { Folders.insert(f); }
void remFldr(Folder* f) { Folders.erase(f); }
};
class Folder
{
friend void swap(Folder&, Folder&);
friend class Message;
public:
Folder() = default;
Folder(const Folder&);
Folder& operator= (const Folder& );
~Folder();
void addMsg(Message * m){ Messages.insert(m); }
void remMsg(Message * m){ Messages.erase(m); }
private:
set<Message*> Messages;
void add_to_message(const Folder &);
void remove_from_message();
};
///////////////////////////////////////////////////////////////Message成员定义
void swap(Message& lhs, Message& rhs)
{
using std::swap;
lhs.remove_from_Folders();
rhs.remove_from_Folders();
swap(lhs.Folders, rhs.Folders);
swap(lhs.contents, rhs.contents);
lhs.add_to_Folders(lhs);
rhs.add_to_Folders(rhs);
}
Message::Message(const Message & m)
{
contents = m.contents;
Folders = m.Folders;
add_to_Folders(m);
}
Message& Message:: operator=(const Message& m)
{
remove_from_Folders();//更新相应的Folders
contents = m.contents;
Folders = m.Folders;
add_to_Folders(m);
return *this;
}
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 Message::save(Folder & f)
{
Folders.insert(&f);
f.addMsg(this);
}
void Message::remove(Folder & f)
{
Folders.erase(&f);
f.remMsg(this);
}
/////////////////////////////////////////////Folders类的成员定义
void swap(Folder& lhs, Folder& rhs)
{
using std::swap;
lhs.remove_from_message();
rhs.remove_from_message();
swap(lhs.Messages, rhs.Messages);
lhs.add_to_message(lhs);
rhs.add_to_message(rhs);
}
Folder::Folder(const Folder& f)
{
Messages = f.Messages;
add_to_message(f);
}
Folder& Folder:: operator= (const Folder& f)
{
remove_from_message();
Messages = f.Messages;
add_to_message(f);
return *this;
}
Folder::~Folder()
{
this->remove_from_message();
}
void Folder:: remove_from_message()
{
for (auto m : Messages)
m->addFldr(this);
}
void Folder:: add_to_message(const Folder & f)
{
for (auto m : f.Messages)
m->addFldr(this);
}
int main()
{
Message a("aaaaaaaaaaaa");
Message b("bbbbbbbbbbbbb");
Folder f1;
a.save(f1);
b = a;
return 0;
}