做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'。 –