const
- 正解の課題の1つは、途中で行うことができないことです。それはすべてか何かのどちらかです。途中でやろうとすると、あなたがここにいるような厳しい場所で終わる。あなたは良いconst
- 正しいクラスは、const
- 正しいものではありませんいくつかのクレイジー古い、一般的には古い(古いcrummudgeonによって書かれた)コードで使用されていると終わるだけで動作しません。 const
- 正解がすべての問題の価値があるかどうか疑問に思うままになります。
直接できません。あなたもそうではありません。しかし、別の方法があります...
明らかに、const
メソッドから非const
メソッドを呼び出すことはできません。さもなければ、const
はメンバー機能に適用されるとき意味を持たないでしょう。
const
メンバ関数は、mutable
という名前のメンバ変数を変更できますが、これはあなたのケースでは不可能であることを示しています。
あなたはSomeClass* me = const_cast<SomeClass*>(this);
ような何かを行うことによって、離れconst
ネスをキャストしようとする可能性がありますがA)これは通常、UBになり、または2)それはconst
-correctnessの全体的なアイデアに違反します。
あなたが実際に達成しようとしていることがこれをサポートするならば、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();
}
const関数であるという基本ルールに反していませんか? – DumbCoder
@DumbCoder、外部からは、クライアントに見えるものは何も変更されていないという点でconst関数です。 –
非constメソッドは、オブジェクト内の一部のデータが変更されていることを意味します。 'someMethod()'が非constメソッドを呼び出すと、それは間接的にデータを変更しています。だから、本当に 'someMethod()'は単に 'const'であってはいけません。 –