简体   繁体   English

保护再次自我分配

[英]Protection again self-assignment

I was reading about copy-control and came across the following sample in the book C++ Primer (chapter 13.4). 我正在阅读有关复制控制的内容,并在C ++ Primer (第13.4章)一书中看到了以下示例。

My question is about the remove_from_Folders(); 我的问题是关于remove_from_Folders(); inside copy assignment operator: 内部复制赋值运算符:
If we firstly do remove_from_Folders(); 如果我们先做remove_from_Folders(); , in the case of self assignment, doesn't its folders.clear(); ,在自我赋值的情况下,不是它的folders.clear(); clear the data member of rhs and cause a failure? 清除rhs的数据成员并导致失败?

 Message& Message::operator=(const Message &rhs) { // handle self-assignment by removing pointers before inserting them remove_from_Folders(); // update existing Folders contents = rhs.contents; // copy message contents from rhs folders = rhs.folders; // copy Folder pointers from rhs add_to_Folders(rhs); // add this Message to those Folders return *this; } // remove this Message from the corresponding Folders void Message::remove_from_Folders() { for (auto f : folders) // for each pointer in folders f->remMsg(this); // remove this Message from that Folder folders.clear(); } 

The class is defined as: 该类定义为:

 class Message { friend class Folder; public: // folders is implicitly initialized to the empty set explicit Message(const std::string &str = ""): contents(str) { } // copy control to manage pointers to this Message Message(const Message&); // copy constructor Message& operator=(const Message&); // copy assignment ~Message(); // destructor // add/remove this Message from the specified Folder's set of messages void save(Folder&); void remove(Folder&); private: std::string contents; // actual message text std::set<Folder*> folders; // Folders that have this Message // utility functions used by copy constructor, assignment, and destructor // add this Message to the Folders that point to the parameter void add_to_Folders(const Message&); // remove this Message from every Folder in folders void remove_from_Folders(); }; 

https://github.com/Mooophy/Cpp-Primer/tree/master/ch13 https://github.com/Mooophy/Cpp-Primer/tree/master/ch13

the sampe code listed above is more appropriate for handling operator=(self) 上面列出的样本代码更适合处理operator =(self)

Message& Message::operator=(const Message &rhs) {
    if (this != &rhs) { // self-assigment check is necessary
                        // while remove_from_Folders() do folders.clear()
        remove_from_Folders();    // update existing Folders
        contents = rhs.contents;  // copy message contents from rhs
        folders = rhs.folders;    // copy Folder pointers from rhs
        add_to_Folders(rhs);      // add this Message to those Folders
    } 
    return *this;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM