做const
-正确性的挑战之一是你不能半途而废。它可以是全部或全部。如果你试图做到这一点,你最终会遇到一个像你这样的难题。你最终会得到一个不错的const
-正确的类正在被一些疯狂的旧的,通常遗留的(或由旧的crummudgeon编写的)代码使用,它不是const
-正确的,它只是不起作用。你仍然想知道const
-正确性是否值得所有的麻烦。
你不能 - 不能直接。你也不应该。但是,还有一种替代方法...
显然,您不能通过const
方法调用非const
方法。否则,const
应用于成员函数时将没有意义。
A const
成员函数可以更改标记为mutable
的成员变量,但是您已经指出在您的情况下这是不可能的。
你可以尝试做一些像SomeClass* me = const_cast<SomeClass*>(this);
抛掷const
内斯,但A)这通常会导致UB,或2)违反const
-correctness的整体思路。
你可以做的一件事情是,如果你真的想要完成的事情能够支持这个,那就是创建一个非const
代理对象,并且做一些非const
的事情。即:
#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();
}
这不是违背常量函数的基本规则吗? – DumbCoder
@DumbCoder,从外部看,它是一个const函数,因为客户端没有任何可见的变化。 –
非const方法意味着它正在改变对象中的一些数据。如果'someMethod()'调用非const方法,那么它会间接地改变数据。所以真的,'someMethod()'不应该是'const'。 –