C++ Primer 练习13.36和13.37
2016-04-12 21:21
471 查看
---------------------------------Message.h--------------------------------- #ifndef MESSAGE_H #define MESSAGE_H #include <string> #include <set> #include <iostream> using namespace std; class Folder; class Message{ friend class Folder; friend void swap(Message &lmsg, Message &rmsg); public: explicit Message(const string &str = "") :contents(str) {} Message(const Message &str); Message &operator=(const Message &str); ~Message(); void save(Folder &);//本类用以添加Folder对象,同时在Folder中添加本类(调用addMsg) void remove(Folder &);//本类用以移除Folder对象,同时在Folder中移除本类(调用remMsg) private: string contents; set<Folder*> folders; void add_to_Folders( Message&);//向Folder类添加Message,有目的的声明为private void remove_from_Folders();//移除Folder类的Message /*声明为private。一般非本类对象调用,只能被Folder调用(其目的是在本类中添加Folder)。 否则无法向Folder中Message。若想要被本类对象调用,则必须将本类成员函数add_to_Folder声明为public, 之后调用此函数和add_to_folder函数向本类对象中添加Folder和向Folder中添加Message, 为了避免影响故而声明为private*/ void addFolder(Folder *f); void remFolder(Folder *f);//目的:移除本类对象的Folder。用法同上 }; #endif void swap(Message &lmsg, Message &rmsg);
---------------------------------Message.cpp--------------------------------- #include "Message.h" #include "Folder.h" void Message::addFolder(Folder *f){ folders.insert(f); } void Message::remFolder(Folder *f){ folders.erase(f); } void Message::save(Folder &f){ folders.insert(&f); f.addMsg(this); } void Message::remove(Folder &f){ folders.erase(&f); f.remMsg(this); } void Message::add_to_Folders( Message &msg){ for (auto be : msg.folders) be->addMsg(&msg); } void Message::remove_from_Folders(){ for (auto be : this->folders) be->remMsg(this); } Message::Message(const Message &str){ contents = str.contents; folders = str.folders; add_to_Folders(*this); } Message& Message::operator=(const Message &msg){ remove_from_Folders(); folders = msg.folders; contents = msg.contents; add_to_Folders(*this); return *this; } Message::~Message(){ remove_from_Folders(); } void swap(Message &lmsg, Message &rmsg){ lmsg.remove_from_Folders(); rmsg.remove_from_Folders(); swap(lmsg.contents, rmsg.contents); swap(lmsg.folders, rmsg.folders); lmsg.add_to_Folders(lmsg); rmsg.add_to_Folders(rmsg); }
---------------------------------Folder.h--------------------------------- #ifndef FOLDER_H #define FOLDER_H #include <iostream> #include <string> #include <set> using namespace std; class Message; class Folder{ friend class Message; public: Folder() = default; Folder(const Folder&f); Folder& operator=(const Folder &f); ~Folder(); void save(Message &msg); void remove(Message &msg); private: set<Message*> messages; void add_to_msg(Folder &f); void remove_from_msg(); void addMsg(Message *msg); void remMsg(Message *msg); }; #endif
---------------------------------Folder.cpp--------------------------------- #include "Folder.h" #include "Message.h" void Folder::save(Message &msg){ messages.insert(&msg); msg.addFolder(this); } void Folder::remove(Message &msg){ messages.erase(&msg); msg.remFolder(this); } void Folder::add_to_msg(Folder &f){ for (auto be : f.messages) be->addFolder(&f); } void Folder::remove_from_msg(){ for (auto be : messages) be->remFolder(this); } void Folder::addMsg( Message *msg){ messages.insert(msg); } void Folder::remMsg(Message *msg){ messages.erase(msg); } Folder::Folder(const Folder &f){ messages = f.messages; add_to_msg(*this); } Folder& Folder::operator=(const Folder &f){ remove_from_msg(); messages = f.messages; add_to_msg(*this); return *this; } Folder::~Folder(){ remove_from_msg(); }
---------------------------------main.cpp--------------------------------- #include "Folder.h" #include "Message.h" int main(){ Message m1("xingxiuyan"),m2("lindaiyu"),m3("xuebaochai"); Folder f1, f2, f3, f4, f5; m1.save(f1); f1.save(m2); return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C与C++之间相互调用实例方法讲解