【发布时间】:2012-01-09 15:45:48
【问题描述】:
我的班级中有一个 const 方法,它不能更改为非常量。在这个方法中,我需要调用一个非常量方法,但编译器不允许我这样做。
有什么办法可以解决吗?这是我的代码的简化示例:
int SomeClass::someMethod() const {
QColor saveColor = color();
setColor(QColor(255,255,255)); // Calling non-const method
// ....
setColor(saveColor); // restore color
return 1;
}
【问题讨论】:
-
这不是违反 const 函数的基本规则吗?
-
@DumbCoder,从外部看,它是一个 const 函数,客户端可见的任何内容都没有改变。
-
mutable关键字允许在 const 方法中更改数据,但没有人会建议停止使用 mutable 并将方法更改为非常量。作为一名程序员,我知道我正在设置一种颜色,然后恢复这种颜色。我知道数据没有改变,所以我正在寻找一种方法来向编译器表明这一点。 -
@Laurent:你说的是真的,但是如果有人创建了
SomeClass的const实例,那么修改其mutable成员是定义行为,但UB 修改其非- 可变成员。因此,您实际拥有的情况与您与之比较的情况之间存在重要差异。标记someMethodconst 的作用是允许调用者在const对象上调用它,以及通过references-to-const在非const对象上调用它,并且不能将两者分开。抛弃 const 依赖于调用者仅在非 const 对象上使用该函数。 -
一个可能的解决方案是更改
// ....中的代码,使其不需要使用对象的“当前颜色”。添加您使用的所有函数的版本,这些版本采用QColor参数。当然,这依赖于能够更改隐藏代码中使用的接口。它也可能有不同的行为 - 在您的代码中,如果// ....抛出然后对象的颜色已更改,而在我的建议中您将失去这种效果。
标签: c++ methods constants const-correctness