C++ Primer 5th笔记(chap 13 拷贝控制)实例1
生活随笔
收集整理的这篇文章主要介绍了
C++ Primer 5th笔记(chap 13 拷贝控制)实例1
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
1. Folder和Message的类设计
2. Messager.h
3. save和remove
void Message::save(Folder &f) {folders.insert(&f); // add the given Folder to our list of Foldersf.addMsg(this); // add this Message to f's set of Messages }void Message::remove(Folder &f) {folders.erase(&f); // take the given Folder out of our list of Foldersf.remMsg(this); // remove this Message to f's set of Messages }4. folder 相关
// add this Message to Folders that point to m void Message::add_to_Folders(const Message &m) {for (auto f : m.folders) // for each Folder that holds mf->addMsg(this); // add a pointer to this Message to that Folder }// remove this Message from the corresponding Folders void Message::remove_from_Folders() {for (auto f : folders) // for each pointer in foldersf->remMsg(this); // remove this Message from that Folderfolders.clear(); // no Folder points to this Message }5. 拷贝构造
Message::Message(Message &&m): contents(std::move(m.contents)) {move_Folders(&m); // moves folders and updates the Folder pointers }Message::Message(const Message &m): contents(m.contents), folders(m.folders) {add_to_Folders(m); // add this Message to the Folders that point to m }6. 析构
Message::~Message() {remove_from_Folders(); }7. 拷贝赋值
Message& Message::operator=(Message &&rhs) {if (this != &rhs) { // direct check for self-assignmentremove_from_Folders();contents = std::move(rhs.contents); // move assignmentmove_Folders(&rhs); // reset the Folders to point to this Message}return *this; }Message& Message::operator=(const Message &rhs) {// handle self-assignment by removing pointers before inserting themremove_from_Folders(); // update existing Folderscontents = rhs.contents; // copy message contents from rhsfolders = rhs.folders; // copy Folder pointers from rhsadd_to_Folders(rhs); // add this Message to those Foldersreturn *this; }8. swap
void swap(Message &lhs, Message &rhs) {using std::swap; // not strictly needed in this case, but good habit// remove pointers to each Message from their (original) respective Foldersfor (auto f: lhs.folders) f->remMsg(&lhs);for (auto f: rhs.folders) f->remMsg(&rhs);// swap the contents and Folder pointer setsswap(lhs.folders, rhs.folders); // uses swap(set&, set&)swap(lhs.contents, rhs.contents); // swap(string&, string&)// add pointers to each Message to their (new) respective Foldersfor (auto f: lhs.folders) f->addMsg(&lhs);for (auto f: rhs.folders) f->addMsg(&rhs); }9. 移动赋值
// move the Folder pointers from m to this Message void Message::move_Folders(Message *m) {folders = std::move(m->folders); // uses set move assignmentfor (auto f : folders) { // for each Folder f->remMsg(m); // remove the old Message from the Folderf->addMsg(this); // add this Message to that Folder}m->folders.clear(); // ensure that destroying m is harmless }【参考】
[1] 代码copyControl.h
总结
以上是生活随笔为你收集整理的C++ Primer 5th笔记(chap 13 拷贝控制)实例1的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: C++ Primer 5th笔记(cha
- 下一篇: C++ Primer 5th笔记(cha