primer C++笔记
拷贝控制示例
class Folder
{
friend class Message;
public:
void addMsg(Message *);
void remMsg(Message *);
};
class Message
{
friend class Folder;
friend void swap(Message& lhs, Message& rhs);
public:
explicit Message(const string& str = string())
:contents(str) {}
Message(const Message&);
Message& operator=(const Message&);
~Message();
void save(Folder &);
void remove(Folder &);
private:
void add_to_folders(const Message& );
void remove_from_folders();
string contents;
set<Folder*> 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::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);
}
}
Message::~Message()
{
remove_from_folders();
}
Message::Message(const Message& m)
:contents(m.contents), folders(m.folders)
{
add_to_folders(m);
}
Message& Message::operator=(const Message& m)
{
remove_from_folders();
contents = m.contents;
folders = m.folders;
add_to_folders(m);
}
void swap(Message& lhs, Message& rhs)
{
for ( auto f : lhs.folders )
{
f->remMsg(&lhs);
}
for (auto f : rhs.folders)
{
f->remMsg(&rhs);
}
using std::swap;
swap(lhs.contents, rhs.contents);
swap(lhs.folders, rhs.folders);
for (auto f : lhs.folders)
{
f->addMsg(&lhs);
}
for (auto f : rhs.folders)
{
f->addMsg(&rhs);
}
}