gpt4 book ai didi

c++ - 在 c++ 中正确替代 'mutable function'

转载 作者:IT老高 更新时间:2023-10-28 21:45:00 26 4
gpt4 key购买 nike

在 c++ 中将算法包装到类中时,我经常遇到 const 正确性的问题。我觉得我想要一个可变函数,虽然这是不允许的。谁能告诉我如何实现下面的类?

以下是我想要写的代码。

  • 函数 run() 不应该是const 函数,因为它改变了数据。
  • 函数 get_result() 应该是一个常量函数(就用户而言),因为它返回数据。

但是,如果用户在没有调用 run() 的情况下请求结果,我希望 get_result() 函数运行算法。这破坏了 const 的正确性,因为我有一个调用非 const 函数的 const 函数。

class operate_on_data
{
std::vector<double> m_data; // the data to modify
bool m_completed; // check to see if the function run() has been called
public:
operate_on_data(std::vector<double> data)
: m_data(data), m_completed(false) {} //initialise
void run() //I don't want this function to be const
{
//The algorithm goes here - it alters m_data.
m_completed = true; //the algorithm has been run
}
std::vector<double> get_result() const //I want this function to be const
{
/*The following breaks const correctness because
I am calling a non-const function from a const function
- but this feels like the right thing to do ... */
if (!m_completed) run(); //run the algorithm if it has not run already
return m_data; //return
}
};

我设法编译上述类的唯一方法是

  • 使 run() 为 const,并使 m_data 和 m_completed 可变。这可行,但在概念上是错误的,因为 run() 明显改变了数据。
  • 使 get_result() 不是一个常量函数。这似乎也是错误的,因为用户会期望这个函数是一个简单的返回,因此是常量。
  • 将 run() 函数放入 get_result() const 函数中,并使数据变量可变。

我的理解是 mutable 关键字是为这些选项中的第三个设计的,其中实现需要更改数据,但用户合理地期望一个简单的返回,因此是 const 函数。

但是,我不想执行此最终选项,因为我希望用户能够准确地选择何时更改数据。但是,他们有可能会忘记调用 run(),因此如果他们在不调用 run() 的情况下请求结果,我想强制执行该算法。我想使 run() 可变 - 但我不被允许。

编写这样一个类的正确方法是什么?

最佳答案

使 run() 为 const,并使 m_data 和 m_completed 可变。这可行,但在概念上是错误的,因为 run() 明显改变了数据。

事实上,这不是真的。事实上,你的类中的变量已经改变了,但你永远无法证明这一点。调用 run() 不会更改用户能够从您的类界面检索到的任何内容。如果您无法检索有关此类更改的任何信息,那么您就无法证明该更改。这不仅仅是一个语义问题,它直接说明了“可变”关键字的全部意义。

“可变”关键字被严重误解。

也就是说,虽然我所掌握的信息很少,但我可能会按照上述方式进行操作,但我不建议这样做。考虑到您的问题的更大 View ,几乎可以肯定会有更好的方法。

我可能使用的另一种方法是您显然设置为避免的方法:强制用户在使用 get_data() 之前调用 run()。不过说实话,这也是一种非常不理想的方法。或许更是如此。

编辑:

如果您决定使用可变方法,那么我建议您进行一些更改。拥有一个名为 'run()' 的函数,它是 const 并且不返回任何感兴趣的内容,这会非常令人困惑。这个函数当然应该是非常量的。因此,如果已经决定这样做,我会做的是让 run() 调用具有当前“run()”函数行为的 const 和私有(private)函数,该函数也由 get_data( ) 在指定条件下。

关于c++ - 在 c++ 中正确替代 'mutable function',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4248573/

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