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++,写了两个小时--过程略刺激