Uno de los desafíos de hacer const
-corrección es que no puede hacerlo a la mitad. Es todo o nada. Si tratas de hacerlo a mitad de camino, terminas en un lugar difícil como el que estás aquí. Usted termina con una buena clase const
-correct que está siendo usada por algún viejo código loco, típicamente heredado (o escrito por un viejo crummudgeon) que no es const
-correcto y simplemente no funciona. Usted se pregunta si const
-corrección vale la pena todo el problema.
I need to call a non-const method [from a const method]
No se puede - no directamente. Tampoco deberías. Sin embargo, existe una alternativa ...
Obviamente, no puede llamar a un método que no sea const
desde un método const
. De lo contrario, const
no tendría ningún significado cuando se aplica a funciones miembro.
Una función de miembro const
puede cambiar las variables de miembro marcadas mutable
, pero ha indicado que esto no es posible en su caso.
Se podría tratar de esparcir const
Ness haciendo algo como SomeClass* me = const_cast<SomeClass*>(this);
pero A) Normalmente, esto dará lugar a la UB, o 2) Se viola la idea de const
-correctness.
Una cosa que podría hacer, si lo que realmente está tratando de lograr sería soportar esto, es crear un objeto proxy no const
, y no hacer const
-y cosas con eso. A saber:
#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();
}
¿No sería contrario a la regla cardinal de ser una función const? – DumbCoder
@DumbCoder, desde el exterior, es una función constante porque no se ha modificado nada visible para el cliente. –
Un método no const implica que está cambiando algunos datos en su objeto. Si 'someMethod()' llama a un método no const, entonces está cambiando indirectamente los datos. Entonces realmente, 'someMethod()' simplemente no debería ser 'const'. –