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 }

 

posted @ 2013-06-28 16:18  joythink89  阅读(235)  评论(0编辑  收藏  举报