Zeiger und const



  • Hi, ich habe eine "Getter"-Funktion, die einen Zeiger auf ein Objekt zurückgibt. Also z.B. sowas:

    Base* GetValue() const;
    

    Diese Lösung finde ich allerdings nicht sauber, da in den meisten Fällen hier auch ein

    const Base* GetValue() const;
    

    funktionieren würde. Der Grund warum ich dies bisher ohne const gelöst habe ist, dass es im Programm vorkommt, dass ich einem anderen Zeiger das Objekt das diese Funktion zurückliefert zuweisen möchte was natürlich nicht geht, da der Zeiger dann auch const sein müsste. Siehe folgendes Beispiel:

    class Example
    {
    private:
    Base* value;
    };
    

    Kann ich nun nicht einfach den value-Zeiger als const definieren?

    class Example
    {
    private:
    const Base* value;
    };
    

    Das Objekt selber wird von der Example-Klasse nicht verändert, aber der Zeiger sollte auch später noch auf andere Objekte zeigen können.
    Oder wäre es sinnvoller das const wegzucasten, wenn das überhaupt geht?



  • Es gibt konstante Zeiger und Zeiger auf konstante Objekte und du brauchst wohl letzteres.



  • Ok, das geht wirklich, allerdings gibt es da jetzt auch noch eine Setter Funktion:

    void SetValue(Base* value);
    

    Diese bekommt natürlich ein nicht konstantes Objekt übergeben, da sie das Objekt verändern können muss. Muss ich hier jetzt einen const_cast verwenden? Und ist das so gutes Design?

    const Base* temp = GetValue();
    SetValue(temp); // const_cast?
    

  • Mod

    Student83 schrieb:

    Muss ich hier jetzt einen const_cast verwenden?

    Was heißt hier muss? const_cast ist fast immer ein deutliches Zeichen für einen Designfehler und deine Beschreibung klingt sehr nach Designfehler. Wird das Objekt nun verändert oder nicht? Es kann nicht beides richtig sein.



  • Es gibt Klassen die es verändern, aber auch Klassen die es eben nicht tun.



  • Student83 schrieb:

    Es gibt Klassen die es verändern, aber auch Klassen die es eben nicht tun.

    Dann ist es nicht konstant. Es durch const_cast zu kaschieren macht keinen Sinn.



  • Wahrscheinlich hast du recht. Ist halt irgendwo blöd eine Getter-Funktion zu haben die man auch als Setter missbrauchen kann.



  • Student83 schrieb:

    Und ist das so gutes Design?

    Ich sehe da nur zwei Zeilen Code und kein "Design". Das Wort wird inflationär für jeden Dreck verwendet.


Anmelden zum Antworten