Wie kann man eine nichtkonstante Methode von einer Konst-Methode aufrufen?

9

Ich habe in meiner Klasse eine const-Methode, die nicht in non-const geändert werden kann. Bei dieser Methode muss ich eine nicht-konstante Methode aufrufen, aber der Compiler lässt mich das nicht tun.

Gibt es einen Weg um es herum? Hier ist ein vereinfachtes Beispiel meines Codes:

%Vor%     
this.lau_ 30.11.2011, 11:43
quelle

4 Antworten

6

Eine der Herausforderungen beim Ausführen von const -korrektheit ist, dass du es nicht auf halbem Wege schaffen kannst. Es ist entweder alles oder nichts. Wenn Sie versuchen, es auf halbem Wege zu tun, enden Sie in einer schwierigen Stelle, als ob Sie hier sind. Sie erhalten am Ende eine nette const -korrekte Klasse, die von verrückten alten, typischerweise veralteten (oder von einem alten Crummudgeon geschriebenen) Code benutzt wird, der nicht const -korrekt ist und einfach nicht funktioniert. Sie fragen sich, ob const -correctness all die Mühe wert ist.

%Vor%

Sie können nicht - nicht direkt. Du solltest es auch nicht. Es gibt jedoch eine Alternative ...

Offensichtlich können Sie nicht eine nicht- const -Methode von einer const -Methode aufrufen. Andernfalls hätte const keine Bedeutung, wenn es auf Elementfunktionen angewendet wird.

Eine const -Memberfunktion kann Mitgliedsvariablen ändern, die mit mutable markiert sind, aber Sie haben angegeben, dass dies in Ihrem Fall nicht möglich ist.

Sie könnten versuchen, const ness wegzuwerfen, indem Sie etwas wie SomeClass* me = const_cast<SomeClass*>(this); tun, aber A) Dies führt normalerweise zu UB oder 2) Es verletzt die ganze Idee von const -korrektheit.

Eine Sache, die Sie tun könnten, wenn das, was Sie wirklich erreichen wollen, dies unterstützen würde, ist, ein Nicht- const -Proxy-Objekt zu erstellen, und nicht const -y-Zeug damit. Um zu sagen:

%Vor%     
John Dibling 30.11.2011, 18:17
quelle
11

Sie könnten const_cast auf this Zeiger,

verwenden %Vor%

Wenn Sie dies jedoch für ein Objekt tun, das ursprünglich als const deklariert wurde, geraten Sie in ein undefiniertes Verhalten.

Also das:

%Vor%

ist in Ordnung, aber das:

%Vor%

ergibt undefiniertes Verhalten.

Die wirkliche Lösung ist, dass Ihre const -Funktion nicht in erster Linie const sein sollte.

    
sharptooth 30.11.2011 11:47
quelle
6

Wenn Sie einen internen Status innerhalb einer const -Methode ändern müssen, können Sie auch den betroffenen Status mutable :

deklarieren %Vor%

Dies ist für Fälle gedacht, in denen Sie Dinge wie Mutexe als Mitglieder Ihrer Klasse haben. Das Erlangen und Freigeben eines Mutex hat keinen Einfluss auf den Zustand des Client-Visible, ist aber technisch in einer const -Methode verboten. Die Lösung ist, den Mutex mutable zu markieren. Ihr Fall sieht ähnlich aus, obwohl ich denke, dass Ihre Klasse ein Refactoring erfordert, damit diese Lösung anwendbar ist.

Vielleicht möchten Sie auch diese Antwort lesen, um zu erfahren, wie Sie diese temporäre Statusänderung ausnahmesicher machen können mit RAII.

    
Björn Pollex 30.11.2011 11:54
quelle
5
  

Wie ruft man eine nichtkonstante Methode aus einer const-Methode auf?

Das solltest du nicht. Es kann zu undefiniertem Verhalten kommen, wenn Sie die Eigenschaft this mit const_cast wegwerfen. Die Verwendung von const_cast schließt den Mund des Compilers, aber das ist keine Lösung. Wenn Sie das tun müssen, dann bedeutet das, dass die const-Funktion nicht const an erster Stelle sein sollte. Mach es nicht-const.

Oder Sie sollten etwas anderes tun, was nicht erfordert, dass Sie eine nicht-konstante Funktion von const function aufrufen. Wie, rufen Sie setColor Funktion nicht auf? Wie, teilen Sie die const-Funktion in mehr als eine Funktionen (wenn Sie das tun können)? Oder etwas anderes?

Wenn setColor in Ihrem speziellen Fall nur eine Mitgliedsvariable, zB m_color , setzt, können Sie mutable :

deklarieren %Vor%

und setze es dann in deine const-Funktion, ohne setColor function aufzurufen und ohne const_cast .

    
Nawaz 30.11.2011 11:48
quelle