13章 Message和Folder的实现

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<memory>//the hearder file of shared_ptr
  4 #include <vector>
  5 #include <list>
  6 #include <map>
  7 #include <string>
  8 #include <set>
  9 
 10 using namespace std;
 11 
 12 class Message;
 13 class Folder {
 14     friend class Message;
 15     friend void print(const Folder&);
 16 public:
 17     Folder(){}
 18     Folder(const Folder&);//拷贝构造函数需要把指向自己的指针放进Message维护的set中
 19     Folder& operator=(const Folder&);//做析构函数和拷贝构造函数的工作
 20     ~Folder();//需要将自己所拥有的mes中的this指针删除
 21 
 22 private:
 23     set<Message*> mes;
 24 
 25     void add_all_mes(const Folder&);
 26     void rev_all_mes();//
 27 
 28     void addmes(Message *const);
 29     void revmes(Message *const);//单向操作而已
 30 };
 31 
 32 
 33 class Message {
 34     friend void print(const Folder&);
 35     friend class Folder;
 36 public:
 37     Message(const std::string &t = "") :content(t) {}
 38     Message(const Message&);
 39     Message& operator=(const Message&);
 40     ~Message();
 41 
 42     void save(Folder&);
 43     void remove(Folder&);//非常量引用
 44 
 45 private:
 46     std::string content;
 47     std::set<Folder*> folders;
 48     //下面两个是单向操作
 49     void add_to_floders(const Message&);
 50     void rev_from_folders();
 51 };
 52 
 53 void Folder::add_all_mes(const Folder&f){//构造函数调用
 54     //mes = f.mes;
 55     for (const auto&pm : f.mes)pm->folders.insert(this);//this 和 f的区别
 56 }
 57 
 58 void Folder::rev_all_mes() {//析构函数调用,只需要管好别人的事,自己的东西委托析构函数处理
 59     for (const auto&pm : mes)pm->folders.erase(this);
 60 }
 61 
 62 void Folder::addmes(Message*const pm) {
 63     mes.insert(pm);
 64 }
 65 
 66 void Folder::revmes(Message*const pm) {//注意const应该修饰指针,即应该是顶层const
 67     mes.erase(pm);
 68 }
 69 
 70 Folder::Folder(const Folder& rhs) :mes(rhs.mes) {
 71     add_all_mes(rhs);
 72 }
 73 
 74 Folder::~Folder() {
 75     rev_all_mes();
 76 }
 77 
 78 Folder& Folder::operator=(const Folder& rhs) {
 79     rev_all_mes();
 80 
 81     mes = rhs.mes;
 82     add_all_mes(rhs);
 83     return *this;
 84 }
 85 
 86 
 87 
 88 //与Folder类不同,下面的两个函数是双向操作,即同时更新Folder和Message两个类,且调用Folder的私有函数
 89 void Message::save(Folder&f) {
 90     folders.insert(&f);
 91     f.addmes(this);
 92 }
 93 
 94 void Message::remove(Folder&f) {
 95     folders.erase(&f);
 96     f.revmes(this);
 97 }
 98 
 99 void Message::add_to_floders(const Message&m) {
100     for (auto &f : m.folders)f->addmes(this);
101 }
102 
103 void Message::rev_from_folders() {
104     for (auto &f : folders)f->revmes(this);
105 }
106 
107 Message::Message(const Message&rhs) :content(rhs.content), folders(rhs.folders) {
108     add_to_floders(rhs);//传入的虽然是引用的参数,压入对应的folders事实上是this指针
109 }
110 
111 Message::~Message() {
112     rev_from_folders();
113 }
114 
115 Message& Message::operator=(const Message&rhs) {
116     rev_from_folders();//先移除,因为底层用set实现,插入相同元素会被忽略,考虑到自赋值,应该先remove一波再add
117     add_to_floders(rhs);
118 
119     content = rhs.content;
120     folders = rhs.folders;
121 
122     return *this;
123 }
124 
125 void print(const Folder& f) {
126     if (f.mes.empty()) { cout << "empty!" << endl;return; }
127     cout << (*(f.mes.begin()))->content << endl;
128 }
129 
130 int f() { return 0; }
131 int main(void) {
132     Folder f;
133     auto p = new Message("xixi");
134     p->save(f);
135     print(f);
136     delete(p);
137     print(f);
138 
139     cout << endl;
140     return 0;
141 }

大概是第一次写有点逻辑的C++,写了两个小时--过程略刺激

posted on 2018-03-16 11:42  只是个回忆录  阅读(253)  评论(0编辑  收藏  举报

导航