Nicht const Methode aus const Methode aufrufen



  • Morgen!

    Ich habe folgende Situation:

    In meiner Klasse Foo habe ich eine Methode, die konstant sein soll:

    float getLength() const;

    Die Längenberechnung übernimmt die private Methode void computeLength(), die NICHT konstant ist (weil sie das Member float length aktualisiert). Nun sieht mein getLength so aus:

    float Foo::getLength() const {
    	if(!isLengthValid)
    		computeLength();
    	return length;
    }
    

    Die Länge wird also nur neu berechnet, wenn sie nicht mehr gültig ist. Mein Problem: computeLength() ist nicht konstant und ich kann die Methode deshalb nicht in getLength() aufrufen. getLength() soll aber konstant bleiben! Wie kann man das lösen?
    Das einzige was mir einfällt ist: (const_cast<HermiteCurve*>( this ))->computeLength();
    Aber vielleicht geht es ja schöner.



  • Zum Beispiel mit

    mutable float length;
    


  • Nexus schrieb:

    Zum Beispiel mit

    mutable float length;
    

    Du meinst also length mutable machen und computeLength const machen. Ja, das sollte gehen, ist aber bissel komisches Design. Denn eigentlich ist ja computeLength NICHT konstant.



  • morgen schrieb:

    ist aber bissel komisches Design. Denn eigentlich ist ja computeLength NICHT konstant.

    Wirklich? Ändert ComputeLength etwas am äußeren Zustand des Objektes? Am Verhalten des Objektes seiner Umgebung gegenüber? Wenn nein -> const. Ich vermute mal, dass du die Länge wegen einer etwas aufwändigeren berechnung immer erst genau dann berechnest wenn du sie brauchst und zwischendurch wenn sie sich veränderst einen Flag setzt dass der gespeicherte Wert nicht mehr aktuell ist. as nennt sich lazy evaluation und ist ein typisches Beispiel für ein mutable Member und eine const Methode, der dem Member einen Wert gibt.



  • morgen schrieb:

    ...ist aber bissel komisches Design. ...

    Für genau solche Situationen ist halt mutable da. Damit sagst Du "Lieber Compiler, innerhalb dieses Rahmens sorge ich selbst für const-correctness, lass Dich davon nicht stören."

    Gruß,

    Simon2.


Anmelden zum Antworten