2
假设我们有一个带有成员函数f
的类A
。 对外界来说,f
只是计算一个值而不修改任何东西A
;但在执行,它临时修改A
:暂时修改常量成员函数中的字段
class A
{
int f() const
{
tiny_change(b); // since copying "b" is expensive
int result = compute(b);
tiny_recover(b); // "b" backs to the original value
return result;
}
B b;
}
当然上面的代码不能编译。这里有两种解决方法,我知道:
const_cast<A*>(this)->b
mutable B b;
这些解决方案都不是完美的。当A
本身的实例是const
时,解决方案1涉及UB;并且解决方案2将可变性暴露给全班,使得它不能防止编码员在其他const
成员函数中意外地修改b
。
const_cast
是“本地”,但可能触发UB; mutable
是内存安全的,但也是“全球”。
那么还有第三种解决方案,还是我理解错了什么?
难道你不是'tiny_change(b)'开发一种'tiny_change(result)'并计算未改变的'B'的结果。 – Zereges
难道你不能只重载'计算'采取“小变化”,并使用它,而不是“b”有什么值? “B”显然与你的课程的逻辑常量有关,而不仅仅是按位。在这种情况下,两种解决方案都是黑客。 – StoryTeller
@Zereges这些函数在我的情况下不是同态的 – rolevax