c++ - 如何定义触发计算的 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 标准,以防这是为什么它起作用的一个相关因素。
解决方案
您没有调用非常量吸气剂;你打电话给自己:
const double& data() const
{
return data();
}
是无限递归。
因为data() const
,*this
是有效const
的方法。该调用data()
相当于this->data()
. 因为this
是 a const A *
,所以这会再次选择const
getter。
因此,我对代码编译感到惊讶
当然它可以编译,但它实际上不起作用。它要么进入无限循环并挂起,要么就崩溃。
推荐阅读
- python-3.x - 无法在机器人框架表单 cmd 行中基于标记运行测试用例
- vue.js - vuetify快速拨号的位置问题
- r - 在R中按组将一列的元素组合成两列
- flutter - 根据内容调整容器的高度
- javascript - React-Native 对象数组比较
- php - 如何防止圣所定义其路线
- c# - 如何以编程方式创建 WPF 按钮和传递参数
- ios - Firebase iOS 6.30.0 SDK 崩溃 - GPBCreateMessageWithAutocreator
- flutter - 如何在 ListView.Builder Flutter 中添加列
- xquery - 元素值和元素属性的双重约束似乎不起作用