gpt4 book ai didi

c++ - 如何定义触发计算的 const getter?

转载 作者:行者123 更新时间:2023-11-30 03:15:15 26 4
gpt4 key购买 nike

我有一个包含偶尔需要重新计算的数据成员的类,尽管在需要重新计算之前它可能会被多次访问。我已经为数据定义了 const 和非 const getter 方法,在 getter 方法中我想检查是否需要运行计算,如果需要则调用适当的方法。在非 const getter 中,我检查该值是否是最新的,如果不是,则在返回数据之前运行计算。在 const getter 中执行相同操作导致编译器提示 this 对象是 const 类型,而计算方法是非 const。因此,令我惊讶的是,如果我只是在 const getter 中调用非常量 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 标准的编译器,以防这是它起作用的相关因素。

最佳答案

您不是在调用非 const getter;你在称呼自己:

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

是无限递归。

由于 data() const*this 在方法中实际上是 const。调用 data() 等同于 this->data()。因为 this 是一个 const A *,所以这会再次选择 const getter。

I was therefore surprised that the code compiles

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

关于c++ - 如何定义触发计算的 const getter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57206848/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com