C++ Primer 第五版 中文版 练习 13.34
题目:编写本节所描述的Message
答:
Message.h
#pragma once
#include <string>
#include <set>
#include "Folder.h"
class Message
{
friend class Folder;
friend void swap(Message &lhs, Message &rhs);
public:
explicit Message(const std::string &str = "") :contents(str) {}
//拷贝控制成员,用来管理指向本Messge的指针
Message(const Message&); //拷贝构造函数
Message& operator=(const Message&); //拷贝赋值运算符
~Message();
//从给定Folder集合中添加Message
void save(Folder &);
//从给定Folder集合中删除Message
void remove(Folder &);
private:
std::string contents; //实际消息文本
std::set<Folder*> folders; //包含本Message的Folder
//拷贝构造函数、拷贝赋值运算符和析构函数所使用的工具函数
//将本Message添加到指向参数的Folder中
void add_to_Folders(const Message&);
//从folders中的每个Folder中删除本Message
void remove_from_Folders();
};
Message.cpp
#include "Message.h"
void Message::save(Folder &f)
{
folders.insert(&f); //将给定Folder添加到我们的Folder列表中
f.addMsg(this); //将本Message添加到f的Message集合中
}
void Message::remove(Folder &f)
{
folders.erase(&f); //将给定的Foldder从我们的Folder列表中删除
f.remMsg(this); //将本Message从f的Message集合中删除
}
void Message::add_to_Folders(const Message &m)
{
for (auto f : m.folders) //对每个包含m的Folder
{
f->addMsg(this); //向该Folder添加一个指向本Message的指针
}
}
void Message::remove_from_Folders()
{
for (auto f : folders)
f->remMsg(this);
}
Message::Message(const Message &m) :contents(m.contents), folders(m.folders)
{
add_to_Folders(m);
}
Message::~Message()
{
remove_from_Folders();
}
Message& Message::operator=(const Message &rhs)
{
remove_from_Folders();
contents = rhs.contents;
folders = rhs.folders;
add_to_Folders(rhs);
return *this;
}
void swap(Message &lhs, Message &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);
}