我在const方法中添加了一些惰性初始化逻辑,这使得该方法实际上不是const.有没有办法让我这样做而无需从公共界面中删除"const"?
int MyClass::GetSomeInt() const { // lazy logic if (m_bFirstTime) { m_bFirstTime = false; Do something once } return some int... }
编辑:"mutable"关键字在这里发挥作用吗?
使m_bFirstTime可变:
class MyClass { : : mutable bool m_bFirstTime; };
......但这也常常表明设计缺陷.所以要小心.
实际上,你说你不想改变头文件.所以你唯一的选择就是抛弃这个指针的常量......
int MyClass::GetSomeInt() const { MyClass* that = const_cast(this); // lazy logic if (that->m_bFirstTime) { that->m_bFirstTime = false; Do something once } return some int... }
如果使用mutable引发一个红色标记,则会启动一个红旗存储到轨道.做这样的事情通常是一个非常糟糕的主意.
我认为这个问题涉及两个概念:(1)"逻辑常数"和(2)"按位常数".通过这个我的意思是从类中获取一些int,不会在逻辑上改变类,并且在大多数情况下它不会改变类成员的位.但是,在某些情况下,和你的一样,确实如此.
在这些情况下,方法是逻辑常量而不是按位常量,编译器无法知道这一点.这就是mutable关键字存在的原因.正如约翰·迪布林所展示的那样使用它,但这不是一个设计缺陷.相反,在许多情况下这是必要的.在你的例子中,我假设int的计算是昂贵的,所以如果不需要,我们不想计算它.在其他情况下,您可能希望缓存方法的结果以供以后使用,等等.
顺便说一句,即使你接受了"可变"答案是正确的,你也必须更新.h!