Rückgabewert (Pointer) darf nicht geändert werden



  • Hallo
    ich habe eine Klasse, die als private Membervariable einen Pointer besitzt (geht leider nicht anders). Nun soll diesem Pointer aber kein neuer Wert zugewiesen werden, wenn ich mit einem Getter diesen Pointer zurückgebe. Ansonsten soll man aber mit dem Pointer arbeiten können.
    Beispiel:

    class Palette
    {
    private:
    LPDIRECTDRAWPALETTE palette; //<-- *IDirectDrawPalette
    public:
    LPDIRECTDRAWPALETTE GetPalette() const {return palette;} //<-- oder muss man hier die Adresse zurückgeben?
    };
    
    //main
    Palette pal();
    //..
    LPDIRECTDRAWPALETTE mypal;
    LPDIRECTDRAWPALETTE mypal2;
    mypal = pal.GetPalette();
    mypal = mypal2;
    

    Eine direkte Zuweisung von mypal an den Rückgabewert geht ja nicht, weil es kein L-Wert ist. Aber der Umweg über den zweiten Pointer sollte auch nicht möglich sein sprich die Membervariable darf nicht verändert werden können sonder nur über die Set Methode gesetzt werden können.
    Ich habe es schon mit const probiert aber klappt irgendwie auch nicht. Und wenn ich beim Getter die Adresse zurückgebe (keine Ahnung ob das richtig ist) bekomme ich ein paar Fehler wegen nicht möglicher Konvertierung vom Compiler.
    Ich muss aber trotzdem mit der struct, die hinter dem Pointer steckt arbeiten können...



  • Die Membervariable (der Zeiger) kann sowieso nicht geändert werden, es sei denn du würdest sie als Referenz (LPDIRECTDRAWPALETTE&) zurückgeben. Die Zuweisung irgendwelcher Pointer, wie in deinem Beispiel, kannst du nicht verhindern, die können dir aber auch egal sein.



  • Hmm das ist natürlich blöd. Denn dann bräuchte man die Set-Methode ja theoretisch nicht mehr. Und aus dem Pointer eine normale Variable machen kann ich glaub ich auch nicht bzw. dann müsste ich in meinen Methoden wieder Zeiger darauf erstellen denke ich, da DirectX immer mit Zeigern arbeitet...



  • Hallo

    Nochmal : Das ist schon richtig so. Du kannst zwar mypal etwas zuweisen, aber diese Zuweisung setzt sich nicht in den Member Palette::palette fort. Wenn LPDIRECTDRAWPALETTE allerdings selber wieder Member hat, können die aufgerufen werden und haben einen Effekt auf die Instanz in Palette::palette. Das kannst du verhindern indem du die Const Correctness einhälst, also

    const LPDIRECTDRAWPALETTE GetPalette() const {return palette;}
    LPDIRECTDRAWPALETTE GetPalette() {return palette;}
    

    Nun kann die Instanz hinter palette nur von außen verändert werden wenn auch die besitzende Instanz von Palette nicht const ist.

    bis bald
    akari


Anmelden zum Antworten