当前位置:  开发笔记 > 编程语言 > 正文

在C++中,我希望我的接口,.h说int getSomeInt()const; ....但实际上方法*DOES*更新"this".

如何解决《在C++中,我希望我的接口,.h说intgetSomeInt()const;.但实际上方法*DOES*更新"this".》经验,为你挑选了3个好方法。

我在const方法中添加了一些惰性初始化逻辑,这使得该方法实际上不是const.有没有办法让我这样做而无需从公共界面中删除"const"?

int MyClass::GetSomeInt() const
{
    // lazy logic
    if (m_bFirstTime)
    {
        m_bFirstTime = false;
        Do something once
    }

    return some int...

}

编辑:"mutable"关键字在这里发挥作用吗?



1> John Dibling..:

使m_bFirstTime可变:

class MyClass
{
  : :
  mutable bool m_bFirstTime;
};

......但这也常常表明设计缺陷.所以要小心.



2> John Dibling..:

实际上,你说你不想改变头文件.所以你唯一的选择就是抛弃这个指针的常量......

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引发一个红色标记,则会启动一个红旗存储到轨道.做这样的事情通常是一个非常糟糕的主意.



3> Andrew Stein..:

我认为这个问题涉及两个概念:(1)"逻辑常数"和(2)"按位常数".通过这个我的意思是从类中获取一些int,不会在逻辑上改变类,并且在大多数情况下它不会改变类成员的.但是,在某些情况下,和你的一样,确实如此.

在这些情况下,方法是逻辑常量而不是按位常量,编译器无法知道这一点.这就是mutable关键字存在的原因.正如约翰·迪布林所展示的那样使用它,但这不是一个设计缺陷.相反,在许多情况下这是必要的.在你的例子中,我假设int的计算是昂贵的,所以如果不需要,我们不想计算它.在其他情况下,您可能希望缓存方法的结果以供以后使用,等等.

顺便说一句,即使你接受了"可变"答案是正确的,你也必须更新.h!

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有