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

来源:互联网 发布:memcached java 编辑:程序博客网 时间:2024/06/06 09:59

编写两个可能用于邮件处理的类,分别命名为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
原创粉丝点击