zoukankan      html  css  js  c++  java
  • 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++,写了两个小时--过程略刺激

  • 相关阅读:
    python详解json模块
    postman---post请求数据类型
    postman---postman发送请求
    SpringBoot之集成通用Mapper
    Mybatis-generator/通用Mapper/Mybatis-Plus对比
    spring-data-JPA repository自定义方法规则
    JPA之@GeneratedValue注解
    Java工具类NumberUtils使用
    shell函数
    Maven的生命周期
  • 原文地址:https://www.cnblogs.com/schsb/p/8580099.html
Copyright © 2011-2022 走看看