做正确的挑战之一const
是你不能半途而废。要么全有,要么全无。如果您尝试半途而废,那么您最终会陷入困境,就像您在这里一样。您最终会得到一个不错的const
-correct 类,该类被一些疯狂的旧的、通常是遗留的(或由旧的 curmudgeon 编写的)代码使用,这些代码不const
正确,而且它只是不起作用。你会想知道const
- 正确性是否值得所有麻烦。
I need to call a non-const method [from a const method]
你不能——不能直接。你也不应该。然而,还有一个替代...
显然,您不能const
从方法中调用非const
方法。否则,const
应用于成员函数时将没有任何意义。
const
成员函数可以更改标记为的成员变量mutable
,但您已经表明这在您的情况下是不可能的。
您可以尝试const
通过执行类似SomeClass* me = const_cast<SomeClass*>(this);
但 A)这通常会导致 UB,或 2)它违反了正确性的整个想法const
。
如果你真正想要完成的事情支持这一点,你可以做的一件事是创建一个非const
代理对象,并用它做非const
-y 的事情。以机智:
#include <iostream>
#include <string>
using namespace std;
class Gizmo
{
public:
Gizmo() : n_(42) {};
void Foo() const;
void Bar() { cout << "Bar() : " << n_ << "\n"; }
void SetN(int n) { n_ = n; };
int GetN() const { return n_; }
private:
int n_;
};
void Gizmo::Foo() const
{
// we want to do non-const'y things, so create a proxy...
Gizmo proxy(*this);
int save_n = proxy.GetN();
proxy.SetN(save_n + 1);
proxy.Bar();
proxy.SetN(save_n);
}
int main()
{
Gizmo gizmo;
gizmo.Foo();
}