Одна из проблем правильности const
в том, что вы не можете сделать это наполовину. Это либо все, либо ничего. Если вы попытаетесь сделать это на полпути, вы окажетесь в трудном положении, как вы здесь. В результате получается хороший const
-корректный класс, который используется каким-то сумасшедшим старым, обычно устаревшим (или написанным старым хламом) кодом, который не является const
-корректным и просто не работает. Вы задаетесь вопросом, стоит ли const
-корректность всех трудностей.
I need to call a non-const method [from a const method]
Вы не можете - не напрямую. Как и вы. Однако есть альтернатива ...
Очевидно, что вы не можете вызвать не const
метод из const
метода. В противном случае const
не будет иметь смысла при применении к функциям-членам.
Функция-член const
может изменять переменные-члены, помеченные mutable
, но вы указали, что в вашем случае это невозможно.
Вы можете попытаться отбросить const
ness, выполнив что-то вроде SomeClass* me = const_cast<SomeClass*>(this);
, но A) Это обычно приводит к UB, или 2) Это нарушает саму идею const
-корректности.
Одна вещь, которую вы могли бы сделать, если то, что вы действительно пытаетесь выполнить, поддержит это, - это создать не 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();
}