首页 > 解决方案 > 如何定义触发计算的 const getter?

问题描述

我有一个包含偶尔需要重新计算的数据成员的类,尽管在需要重新计算之前可能会多次访问它。我已经为数据定义了 const 和非 const getter 方法,并且在 getter 方法中我想检查是否需要运行计算,如果需要则调用适当的方法。在非常量 getter 中,我检查值是否是最新的,如果不是,则在返回数据之前运行计算。在 const getter 中执行相同操作会导致编译器抱怨 this 对象是 const 类型,而计算方法是非常量。因此,如果我只是在 const getter 中调用非 const getter,那么我对代码编译感到惊讶。有人可以解释一下为什么会这样,因为我有点困惑。

class A {

bool isUpToDate=false;
double someData=0;

// Do some calculation
void calcData() 
{
    someData = doSomeCalc();
    isUpToDate = true; // data is now up-to-date
}

// non-const getter
double& data() 
{
    if(!isUpToDate) 
    {
        // run the calculation only if data is not up-to-date
        calcData()
    }
    return someData;
}

// const getter that doesn't work
const double& data() const 
{
    if(!isUpToDate)
    {
        calcData() // compiler error: "this object is type const A but 
        calcData is non-const"
    }
    return someData;
}

// const getter that (mysteriously) works
const double& data() const 
{
    return data(); // why doesn't the compiler complain that data() is non-const?
}

我确信这种行为实际上是合理且定义明确的,我只是好奇它为什么会起作用,因为我不明白这里发生了什么。我使用 g++ 作为我的编译器和 c++11 标准,以防这是为什么它起作用的一个相关因素。

标签: c++

解决方案


您没有调用非常量吸气剂;你打电话给自己:

const double& data() const
{
    return data();
}

是无限递归。

因为data() const,*this是有效const的方法。该调用data()相当于this->data(). 因为this是 a const A *,所以这会再次选择constgetter。

因此,我对代码编译感到惊讶

当然它可以编译,但它实际上不起作用。它要么进入无限循环并挂起,要么就崩溃。


推荐阅读