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