Una delle sfide da fare const
-corretta è che non è possibile farlo a metà. È tutto o niente. Se provi a farlo a metà strada, finisci in un punto difficile come sei qui. Si finisce con una bella classe const
-corretta usata da un vecchio pazzo, tipicamente legacy (o scritto da un vecchio crummudgeon) che non è const
-corretto e semplicemente non funziona. Ti stai chiedendo se vale la pena correggere la correttezza const
.
I need to call a non-const method [from a const method]
Non è possibile - non direttamente. Né dovresti. Tuttavia, esiste un'alternativa ...
Ovviamente non è possibile chiamare un metodo non const
da un metodo const
. Altrimenti, const
non avrebbe alcun significato se applicato alle funzioni membro.
Una funzione membro const
può modificare le variabili membro contrassegnate con mutable
, ma è stato indicato che ciò non è possibile nel tuo caso.
Si potrebbe tentare di gettare via const
ness facendo qualcosa di simile, ma SomeClass* me = const_cast<SomeClass*>(this);
A) Questo in genere si tradurrà in UB, o 2) che viola l'intera idea di const
-correctness.
Una cosa che potresti fare, se quello che stai davvero cercando di ottenere sarebbe di supporto, è creare un oggetto proxy non- const
e fare cose non const
-y con quello. A:
#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();
}
fonte
2011-11-30 18:17:55
Non sarebbe contro la regola cardinale di essere una funzione const? – DumbCoder
@DumbCoder, dall'esterno, è una funzione const in cui non è stato modificato nulla visibile al client. –
Un metodo non const implica che sta modificando alcuni dati nell'oggetto. Se 'someMethod()' chiama un metodo non const, allora sta modificando indirettamente i dati. Quindi in realtà 'someMethod()' semplicemente non dovrebbe essere 'const'. –