在派生类中解决C++方法的const'ness

Gen*_*ent 3 c++ overloading const

我必须使用一个框架,它将一个重要的钩子方法定义为const,就像这样

class FrameworkClass {
  ...
  virtual void OnEventA(unsigned value) const;
  ...
}
Run Code Online (Sandbox Code Playgroud)

在我的派生类中,我必须保存通过钩子获得的值

class MyClass: public FrameworkClass
{
  ...
  virtual void OnEventA(unsigned value) const { savedValue = value; } // error!

private:
  unsigned savedValue;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是我无法改变框架.

有没有一种好方法来绕过钩子方法的常量?

Kir*_*rov 6

使变量可变:
mutable unsigned savedValue;

  • 应该指出的是,虽然这是有效的,但是`mutable`实际上是为构成对象的*bitwise*状态的一部分而不是*logical*状态的东西设计的,即它们不会影响对象的可观察行为.对象,如果他们改变.示例包括内部缓存,惰性评估方案,引用计数等. (3认同)

And*_*hko 5

mutable是太"宽泛"的解决方法因为影响正确使用const'ness的方法.解决不适当的const'ness有const_cast:

class MyClass: public FrameworkClass
{
  ...
  virtual void OnEventA(unsigned value) const { const_cast<MyClass*>(this)->savedValue = value; } // error!

private:
  unsigned savedValue;
}
Run Code Online (Sandbox Code Playgroud)

  • 为了使其有效,您必须确保在非const对象上调用该方法.我不认为有办法从OnEventA中找出它是否如此. (5认同)