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% 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.
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:
Sie könnten const_cast
auf this
Zeiger,
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.
Wenn Sie einen internen Status innerhalb einer const
-Methode ändern müssen, können Sie auch den betroffenen Status mutable
:
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.
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
:
und setze es dann in deine const-Funktion, ohne setColor
function aufzurufen und ohne const_cast
.
Tags und Links const const-correctness c++ methods