Klassenelemente die public sind schützen



  • Hi,
    ich habe eine Klasse, in der ich einen Konfigurationszustand speichern möchte.
    Hier mal ein Beispiel:

    class config
    {
    public:
        config();
        virtual ~config();
        bool set_param1(double val);
        bool set_param2(double val);
        double param1, param2;
    
        ...
    };
    

    Ich will nun, daß "param1" nur mit "set_param1" einen Wert zuweisen kann,
    ich den Wert aber direkt aus "param1" lesen kann. Also so etwas:

    config setup;
    double wert;
    setup.set_param1(0.5);  //param1 einen Wert zuweisen
    wert = setup.param1;  //auslesen des Parameterwertes
    
    setup.param2 = 0.7;  //soll nicht möglich sein
    

    Meine Frage ist nun: Geht so etwas und wenn ja wie?

    DANKE



  • nein, das geht nicht. Aus dem Grund packt man Variablen nach private und bastelt seine getter/setter.



  • Ähm, was spricht denn gegen die Verwendung von private in diesem Fall?
    Dazu ist private doch gedacht!



  • Btw. mit dem Properties-Ansatz der hier neulich diskutiert wurde (war der nicht von Dir kingruedi?) müßte sich sowas sogar realisieren lassen. Ist allerdings viel Aufwand für wenig Effekt. Und man fragt sich wirklich wofür man sowas braucht. Fall es um Speed geht kann ich aber beruhigen. Ein getter ist genauso schnell wie der direkte Zugriff.

    MfG Jester



  • Wofür Properties gut sind, habe ich bisher auch nicht verstanden. Das einzige was man vielleicht machen könnte (und ich auch gerne praktiziere), wenn es viele Attribute gibt, die vielleicht auch noch gruppierbar sind, in ein struct packen.

    struct Point3D {
    float x, y, z;
    };
    
    class Koord {
    public:
        void setPoint(Point3D &p);
        Point3D getPoint();
    private:
        Point3D p3d;
    };
    

    Dann kann der Benutzer das ganze ähnlich Properties benutzen und es kann trotzdem im Setter z.B. eine Wert-Überprüfung statt finden. Bei ein oder zwei Attributen in einer Klasse lohnt sich das natürlich nicht unbedingt.

    Point3D p = myKoord.getPoint();
    p.x = 200.0f;
    p.y = 250.0f;
    p.z = -10.0f:
    myKoord.setPoint(p);
    

    Vorallem, wenn eine Klasse viele Attribute hat, kann man sich so die nervigen Getter/Setter sparen.



  • Proberties, so wie sie in C# zur Verfügung stehen, können durchaus ein schönes Sprachmittel sein.
    Davon abgesehen, dass man in der Code Completion nur noch die Hälfte an gettern und settern drin hat, hat man bei der Benutzung auch irgendwie mehr das Gefühl einer Eigenschaft.

    Methoden sind für mich normalerweise Aktionen, also etwas aktives ( deshalb hasse ich Namen wie size() ).

    Zu deinem Code:
    Das halte ich für ziemlich schlecht. Erst by value getten, ändern und wieder setten. In diesem Beispiel bräuchtest du sogar nicht mal getten sondern nur ein Point erstellen und setten.
    Besser ist es noch, eine Referenz zurück zu liefern. So etwas würde ich dann nicht davon abhängig machen, ob es viele Getter und Setter gibt, sondern ob es sinnvoll ist, etwas zu einer Klasse zusammenzufassen. Evtl. rockt für sowas auch ne nested class.



  • Artchi schrieb:

    Vorallem, wenn eine Klasse viele Attribute hat, kann man sich so die nervigen Getter/Setter sparen.

    Und wenn die struct nen Ctor hat, kann sich das nervige foo.x, foo.y etc. sparen 😉

    Properties sind halt ein anderes Konzept für getter/setter



  • Optimizer schrieb:

    Das halte ich für ziemlich schlecht. Erst by value getten, ändern und wieder setten. In diesem Beispiel bräuchtest du sogar nicht mal getten sondern nur ein Point erstellen und setten.
    Besser ist es noch, eine Referenz zurück zu liefern. So etwas würde ich dann nicht davon abhängig machen, ob es viele Getter und Setter gibt, sondern ob es sinnvoll ist, etwas zu einer Klasse zusammenzufassen. Evtl. rockt für sowas auch ne nested class.

    Hast Recht, war in dem Fall unglücklich, weil ich alle Point3D-Attribute geändert habe. Aber wenn ich z.B. nur zwei ändern will, muß ich mir ja das originale holen. Weil sonst in der Setter der Default-Wert eines "frischen" Point3D gesetzt wird.

    Ist halt nicht das ultimative Verfahren aber es ist ja nur eine Alternative.


Anmelden zum Antworten