我读过很多关于 C++ 中的 const_cast 被认为是错误和危险的讨论,除了与 C 代码的向后兼容外,不应将其用于任何其他用途。我大体上同意。
但是最近我遇到了以下用例,这让我感到疑惑。
我有一些由控制器拥有的模型对象,通常是非常量的。我将它传递给不应能够修改模型对象的视图,因此在传递给视图时将对象声明为 const 参数是合乎逻辑的。然而,视图也使委托回调到控制器,将模型对象作为参数传递(例如,用户单击此对象)。回调参数也必须是常量。在回调方法中,控制器想要对模型进行更改,但是模型是const,所以它做不到。
两种解决方案:
想法?
有两种处理方式const。
事情是const如果这段代码不会直接改变它们。
事情是const如果这段代码不会改变它们。
在这种情况下,视图不会直接更改对象。但是您希望它间接更改对象。
在 (2) 下,这意味着对象不是const。如果间接地,视图可以更改对象。它可能会导致对象发生更改。说这const意味着视图与对象的交互纯粹是“读取状态”,而不是更改状态——但是单击对象的“删除”按钮并使其删除是一种变异操作。
在 (1) 下,您的参考应该是const,因为您不是自己修改它。其他人是在他们有权这样做的授权下进行的。
这是一场冲突。并且 (1) 是一种可接受的使用方式const。但是当使用 (1) 时,你应该有一个到对象的替代路线作为 non- const。
我们可以在vector.erase. 它(现在)需要const_iterators。尽管这些迭代器本身不允许修改向量,但它的const无性*this提供了一个允许修改的替代访问路径。
在您的情况下,控制器拥有该对象,因此应该具有该对象的非const访问路径。这是您应该用来对const对象进行非修改的路径。
当视图进行委托回调时,它可能传递一个标识符而不是一个对象——或者,控制器可能会以某种方式从对象中提取标识符,并在它自己的对象列表中查找它。