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
- C++primer学习:拷贝控制(5)
- C++primer学习:拷贝控制(1)
- C++primer学习:拷贝控制(2)
- C++primer学习:拷贝控制(3)
- C++primer学习:拷贝控制(4)
- C++primer学习笔记----拷贝控制
- c++primer要点-拷贝控制
- C++primer学习:拷贝控制(7):对象移动
- C++primer学习:拷贝控制(5):动态内存管理类_编写自己的vector
- 【足迹C++primer】45、拷贝控制示例
- C++primer阅读笔记----------拷贝控制
- **拷贝控制-拷贝、赋值、销毁(一)c++primer 5e **
- 《C++primer(第五版)》学习之路-第十三章:拷贝控制
- C++primer学习:拷贝控制(6):编写简化的string类
- C++primer学习:面象对象程序设计(4):继承类中的作用域和拷贝控制
- 拷贝控制 c++ primer 5e
- 【足迹C++primer】43、拷贝控制和资源管理
- C++primer第五版笔记-第十三章拷贝控制
- 音响器材输出、输入连接的平衡与非平衡接驳端口问题
- stm32 NRF24L01互相通信成功
- 5-4 BCD解密
- Linux下使用百度云盘
- 同一个进程下的线程共享哪些资源
- C++primer学习:拷贝控制(5)
- 数据结构基础 0.前言
- Java知识点拾遗1
- 5-5 表格输出
- handler机制的原理
- 信号与槽的原理
- java学习之浅谈多线程1
- linux的awk命令按列解析学习总结
- 怎么把excel中的数据导入数据库