Frage zu konstanten Elementfunktionen
-
Hallo,
ich habe mal wieder eine Frage an die Profis hier.
Eine Elementfunktion mache ich ja konstant wenn sie keine Eigenschaft verändert. Wenn ich nun in dieser konstanten Funktion doch einen Wert speicher möchte z.B. für einen Cache dann kann ich dies ja über const_cast erreichen, was aber teilweise auch zu undefiniertem Verhalten führen kann. Wie sieht es aus wenn ich in einer konstanten Elementfunktion eine nicht konstante Funktion aufrufen die wiederum einen Wert ändert, geht das?
-
Ich bin mir gerade nicht sicher, eigentlich dürfte es nicht gehen.
In solchen Fällen nimmt man üblicherweisemutable.
-
cppfrager schrieb:
Eine Elementfunktion mache ich ja konstant wenn sie keine Eigenschaft verändert. Wenn ich nun in dieser konstanten Funktion doch einen Wert speicher möchte z.B. für einen Cache dann kann ich dies ja über const_cast erreichen, was aber teilweise auch zu undefiniertem Verhalten führen kann. Wie sieht es aus wenn ich in einer konstanten Elementfunktion eine nicht konstante Funktion aufrufen die wiederum einen Wert ändert, geht das?
Dazu würdest Du auch einen const_cast brauchen. UB bekommst Du dann, wenn Du ein "physikalisch konstantes" Objekt verändern willst.
Für das Zwischenspeichern von Ergebnissen, die den Objektzustand "logisch gesehen" nicht ändern, gibt es aber das Schlüsselwort
mutable:class foo { int a, b; mutable int x; mutable bool xvalid; void updatex() const { x = a*b; xvalid = true; } public: ... void seta(int a) { this->a = a; xvalid = false; } int getx() const { if (!xvalid) updatex(); return x; } ... };Dieses Beispiel macht natürlich wenig Sinn, soll aber das Prinzip von
mutablezeigen.Edit: Upps! Dass ipsec schon auf mutable aufmerksam gemacht hat, habe ich übersehen.

-
Danke vielmals euch Beiden. Ich sehe gerade das in meinem Buch("Die C++ Programmiersprache" von B.Stroustrup) mutable als nächstes rankommt.
