C++primer学习:拷贝控制(5)

编写两个可能用于邮件处理的类,分别命名为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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值