C
Blockk_ schrieb:
Hallo,
folgendes Beispiel:
class Foo {
public:
Foo* getFoo() const {
// Code...
return this;
}
};
getFoo() liefert einen Compilefehler, weil this ja vom Typ const Foo* const ist, aber ich Foo* zurückgebe.
Aber so ganz verstehe ich das Problem nicht. Das const bei der Methode sagt doch nur, dass die Methode keine Member ändert. Und das mache ich ja nicht. Wieso geht das nicht?
Und wie kann ich das machen, dass die Methode const bleibt (weil sie ja keinen Foo Member ändert), aber dennoch ein Foo* returned (und NICHT const Foo*)?
const bei einer Memberfunktion bedeutet zunächst einmal nur, dass der Objektparameter const-qualifiziert ist und this innerhalb der Funktion den Typ const Foo* hat. Die Unmöglichkeit, nichtstatische Member, die nicht mutable sind, über diesen Zeiger modifizieren zu können, ist Folge der const-Qualifikation, nicht umgekehrt.
Die Rückgabe eines nicht-const-Zeigers aus this in einer const-Memberfunktion erfordert folglich einen cast - der in der Regel unsicher sein wird (weil die Funktion nicht sicherstellen kann, ob das jeweilige Objekt als solches modifizierbar ist).
Falls du einen nicht-konstanten Zeiger nur in den Fällen benötigst, in denen das Ojekt sowieso modifizierbar ist, sollte die Funktion nicht konstant sein, oder es sollte eine entsprechend Überladung existieren.
class Foo {
public:
const Foo* getFoo() const {
// Code...
return this;
}
Foo* getFoo() {
return const_cast<Foo*>(const_cast<const Foo*>(this)->getFoo());
// Das ist sicher, weil wir nur das const wegcasten, dass zuvor explizit hinzugefügt wurde und wir die Implementation von getFoo kennen
// Die Tatsache, dass das eine über das andere implementiert wurde, ist folglich ein Implementationsartefakt und nicht selbst Teil des Interfaces
}
};