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