Zugriffsbeschränkung von Variablen



  • Hallo zusammen,

    wahrscheinlich ist das eine ziemlich grundlegende Frage. Aber ich habe einfach keine Idee für eine Lösung.

    int main() {
        EineKlasse objekt;
        objekt.einAttribut= 999; // Soll nicht funktionieren! (Fehler)
        objekt.aendern(999);      // Es gibt eine Setter! Funktioniert also
    
        //Ab hier unklar
        // erlaubter direkter lesender Zugriff:
        cout << "objekt.einAttribut="
        << objekt.einAttribut<< endl;    // ok
    }
    

    Vor meinem Kommentar im Code "Ab hier unklar" wüsste ich wie ich das umsetzte. Die Variable auf private setzten und die Funktion implementieren, fertig. Aber wie kann ich denn den direkten Zugriff erlauben und gleichzeitig das direkte Ändern verbieten?!

    MfG
    Asse



  • Mit einem Aggregat oder mach doch einfach nen Getter.



  • @spiri Was ist eine Aggregat? Es soll aber ohne Getter funktionieren.



  • Mach ein Getter.

    Du könntest eine konstante Referenz auf die private Variable zeigen lassen. Würde sich halt nur anders nennen.



  • @spiri Es soll aber genauso wie im Code funktionieren



  • Du könntest eine Proxy-Klasse um dein Attribut schreiben. Aber das wäre hässlich und ein design fehler.



  • Warum willst du keinen Getter?

    Wenn du einen ganz dummen Workaround willst: mach die Variable const und setze sie im Konstruktor. Aber ich gehe mal davon aus, dass du den Wert schon irgendwie ändern möchtest.


  • Mod

    @Asse sagte in Zugriffsbeschränkung von Variablen:

    Aber wie kann ich denn den direkten Zugriff erlauben und gleichzeitig das direkte Ändern verbieten?!

    Wenn eine Variable überhaupt änderbar ist, dann ist sie überall modifizierbar. Irgendeine Form von Indirektion ist also in jedem Fall erforderlich.
    spiris Vorschlag über eine Referenz ist naheliegend, hier muss aendern entsprechend so gestaltet werden, dass auf das Attribut nicht über die Referenz zugegriffen wird.
    Eine andere Möglichkeit besteht, wenn einAttribut ein Klassenobjekt ist. In diesem Fall könnte mit einem privaten Zuweisungsoperator (als friend von EineKlasse::aendern) gearbeitet werden.



  • Ok, also ich habe es jetzt mit einer konstanten Referenz gelöst 😃



  • @daddy_felix Ich soll keine Getter verwenden. Das ist eine Übungsaufgabe, die habe ich leider nicht selber gestellt.


Log in to reply