c++primer 拷贝控制实例邮件信息
#include<iostream>
#include<set>
class Messages;
class Folder
{
public:
Folder(){}
void addMsg(Messages *m)
{
file.insert(m);
}
void remMsg(Messages *m)
{
file.erase(m);
}
private:
std::set<Messages*>file;
};
class Messages
{
friend class Folder;
public:
explicit Messages(const std::string &str=""):
contents(str){}
Messages(const Messages&);
Messages& operator=(const Messages&);
~Messages();
void save(Folder&);
void remove(Folder&);
void swap(Messages &lhs,Messages &rhs);
private:
std::string contents;
std::set<Folder*>folders;
void add_to_Folders(const Messages&);
void remove_from_Folders();
};
void Messages::save(Folder &f)
{
folders.insert(&f);
f.addMsg(this);
}
void Messages::remove(Folder &f)
{
folders.erase(&f);
f.remMsg(this);
}
void Messages::add_to_Folders(const Messages &m)
{
for(auto f:m.folders)
f->addMsg(this);
}
Messages::Messages(const Messages &m):
contents(m.contents),folders(m.folders)
{
add_to_Folders(m);
}
void Messages::remove_from_Folders()
{
for(auto f:folders)
f->remMsg(this);
}
Messages::~Messages()
{
remove_from_Folders();
}
Messages& Messages::operator=(const Messages &rhs)
{
remove_from_Folders();
contents=rhs.contents;
folders=rhs.folders;
add_to_Folders(rhs);
return *this;
}
void Messages::swap(Messages &lhs,Messages &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);
}