zoukankan      html  css  js  c++  java
  • Message/Folder primer13章

      1 #include<string>
      2 #include<iostream>
      3 #include<set>
      4 class Folder; 
      5 class Message;
      6 
      7 class Folder
      8 {
      9 public:
     10     void delete_mess(Message* pmess) 
     11     {
     12         messages.erase(pmess);
     13     }
     14     void add_mess(Message* pmess) 
     15     {
     16         messages.insert(pmess);
     17     }
     18     ~Folder();  // 在这里定义函数会说message类没定义。要放在外面。
     19 /*    {
     20         // 对于每个message 要删除指向他的folder
     21         for(std::set<Message*>::iterator it = messages.begin(); it != messages.end(); ++it)
     22             (*it)->delete_folder(this);
     23         std::cout << "~Folder" << std::endl;
     24     }*/
     25 
     26 private:
     27     std::set<Message*> messages;
     28 };
     29 
     30 
     31 class Message
     32 {
     33 public:
     34     Message(std::string str = ""):contents(str){}
     35     Message(const Message& mes);
     36     Message& operator=(const Message& mes);
     37     ~Message();
     38     void add_folder(Folder& fo) 
     39         { folders.insert(&fo);fo.add_mess(this);} 
     40     void delete_folder(Folder* fo) 
     41         { folders.erase(fo); (*fo).delete_mess(this);} 
     42 private:
     43     std::string contents;
     44     std::set<Folder*>  folders;
     45 };
     46 
     47 
     48 Message::Message(const Message& mes):contents(mes.contents),folders(mes.folders)
     49 {
     50     
     51     for(std::set<Folder*>::iterator it = folders.begin(); it != folders.end(); ++it)
     52         (*it)->add_mess(this);
     53 }
     54 
     55 
     56 Message& Message::operator=(const Message& mes)
     57 {
     58     if(this == &mes) return *this;
     59      contents = mes.contents;
     60     for(std::set<Folder*>::iterator it = folders.begin(); it != folders.end(); ++it)
     61         (*it)->delete_mess(this);
     62 
     63     folders = mes.folders;
     64     for(std::set<Folder*>::iterator it = folders.begin(); it != folders.end(); ++it)
     65         (*it)->add_mess(this);
     66     return *this;
     67 }
     68 
     69 Message::~Message()
     70 {
     71     // 对于每一个folder要删除 每一个 folder 指向自己的信息
     72     for(std::set<Folder*>::iterator it = folders.begin(); it != folders.end(); ++it)
     73         (*it)->delete_mess(this);
     74     std::cout<< contents << std::endl;
     75 }
     76 
     77 Folder::~Folder() // 缺少析构函数会导致:如果message删除了,则Folder里面指向垃圾对象,内存报错
     78 {
     79     // 对于每个message 要删除指向他的folder
     80     for(std::set<Message*>::iterator it = messages.begin(); it != messages.end();)
     81     {
     82         std::set<Message*>::iterator next = it;
     83         ++next;
     84         (*it)->delete_folder(this);
     85         it = next;        
     86     }
     87     std::cout << "~Folder" << std::endl;
     88 }
     89 
     90 /*Folder::~Folder()  // 这样为啥是错的。 迭代器失效的操作造成。
     91 {
     92     // 对于每个message 要删除指向他的folder
     93     for(std::set<Message*>::iterator it = messages.begin(); it != messages.end(); ++it)
     94     {
     95         (*it)->delete_folder(this);
     96     }
     97     std::cout << "~Folder" << std::endl;
     98 }
     99 */
    100 
    101 int main()
    102 {
    103     std::string s1("contents1");
    104     std::string s2("contents2");
    105 
    106     Message m1(s1);  //栈区里面定义对象的先后
    107     Message m2(s2);  //顺序会影响程序的执行;特别是
    108     Folder f1;            // Message、Folder的类定义是交叉的。
    109     Folder f2;   
    110 
    111     m2.add_folder(f2);
    112     m1.add_folder(f1);
    113     return 0;
    114 }
  • 相关阅读:
    【洛谷4725】【模板】多项式对数函数(多项式 ln)
    【洛谷4516】[JSOI2018] 潜入行动(树上背包)
    【洛谷4463】[集训队互测2012] calc(动态规划+拉格朗日插值)
    【洛谷1973】[NOI2011] NOI 嘉年华(DP)
    【BZOJ2958】序列染色(动态规划)
    【CF1037H】Security(后缀自动机+线段树合并)
    【洛谷5308】[COCI2019] Quiz(WQS二分+斜率优化DP)
    【BZOJ3512】DZY Loves Math IV(杜教筛)
    【洛谷2178】[NOI2015] 品酒大会(后缀数组+单调栈)
    【BZOJ2878】[NOI2012] 迷失游乐园(基环树DP)
  • 原文地址:https://www.cnblogs.com/jiangyoumiemie/p/3161107.html
Copyright © 2011-2022 走看看