未将此指针设置为const的构造函数会导致未检测到的问题
Constructors not setting this pointer to const causes undetected issues
将我的类裁剪到最小的可读性:
#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;
}
在定义messages
的const
版本时,这段代码可能会导致一些"问题"(尽管一切运行正常)。Message
的构造函数不假设this
指针的const
。所以即使addToFolders
不是const
函数,代码
Message a("hello");
Folder f;
a.save(f);
const Message b(a);
可以很好地编译。这里有一个问题,因为b
是const
消息,但复制构造函数将b
的地址(通过addToFolders()
)设置为由Message*
的set
组成的文件夹-低级const
丢失。实际上,如果我要在Folder
中定义一个函数来改变底层消息,我可以改变const Message b
的contents
,而似乎没有编译错误。
一个解决方案是将Folder
的设置更改为set<const message*>
,但这不允许我通过文件夹更改消息(这实际上是我想要的)。我如何防止message
的const对象被创建,或者更好的是,强制构造函数中的this
指针是const
,这样addToFolders()
就会失败?
您无法阻止const
实例的构建。
如果你在你的构造函数中使用this
,这取决于你是否适当地小心-例如,你可以显式地将其const_cast
转换为const *
。
一般来说,如果对象的管理不在对象自己的类中处理,则效果更好。例如,您可以限制一些事情,以便对象只能通过folder
创建,然后folder
可以确保正确处理它。(这实际上只是关注点分离的一个例子。)
相关文章:
- 通过终端在文件中输入时检测EOF(文件结束)时出现问题
- 用于检测函数是否存在的C++元函数的问题
- 圆形与方形碰撞检测以及需要响应C++ |OpenGL。我的问题就是这个"I need to keep the circle outside the square"
- 线程清理器检测到数据争用,问题出在哪里?
- 三角形-三角形碰撞检测问题
- 使用碰撞检测来增加SFML 2.4中的游戏分数的问题
- Anagram检测方法C .将字符串转换为ASCII值的问题
- 特征检测部门的Sfinae问题
- 解决SDL2按键检测不一致的问题
- openCV中的颜色检测-像素检查问题
- 问题:如何检测小部件是否被选中
- 我的程序停止工作,因为检测到一个问题
- 如何检测/查找 64 位结构对齐问题
- 在 Dlib 中编译问题以进行人脸检测
- 如何检测文件是否存在,而不会因权限问题而脱轨
- 使用 cin.peek() 和使用 cin.peek() 检测输入结束时出现问题
- 用于检测C++模板问题的工具
- ***glibc检测到***和动态分配问题-C++
- 轴对齐边界框碰撞检测问题
- 文本游戏字符冲突检测问题