将我的课程减少到最低限度以提高可读性:
#ifndef MESSAGEFOLDER
#define MESSAGEFOLDER
#include <string>
#include <set>
class Message;
class Folder{
public:
void addMsg(Message* m) { messages.insert(m); }
~Folder() { removeFromMessages(); }
private:
std::set<Message*> messages;
void removeFromMessages(); //removes its pointers from Messages
};
class Message{
friend class Folder;
public:
Message(const std::string &s = ""): contents(s) { }
Message(const Message& rhs): contents(rhs.contents), folders(rhs.folders) { addToFolders(); }
Message& save(Folder&);
~Message() { removeFromFolders(); }
private:
std::string contents;
std::set<Folder*> folders;
void addToFolders();
void removeFromFolders(); //removes its pointers from Folders
};
#endif // MESSAGEFOLDER
在 MessageFolder.cpp 中
void Message::addToFolders(){
for(const auto& f : folders)
f->addMsg(this);
}
Message& Message::save(Folder& f){
folders.insert(&f);
f.addMsg(this);
return *this;
}
在定义const
. 的messages
构造函数Message
不假定指针。因此,即使是非功能代码const
this
addToFolders
const
Message a("hello");
Folder f;
a.save(f);
const Message b(a);
会编译得很好。这里有一个问题,因为b
是一条const
消息,但是复制构造函数将b
的地址(通过addToFolders()
)设置为由 a 组成的文件夹set
-Message*
低级别const
丢失了。事实上,如果我要定义一个函数Folder
来更改底层消息,我可以更改contents
const Message的,b
看似没有编译错误。
一个解决方案是将Folder
' 设置更改为,set<const message*>
但这不允许我通过文件夹更改消息(我确实希望这样做)。我将如何防止message
创建 const 对象,或者更好的是,强制this
构造函数中的指针const
失败addToFolders()
?