Getter- und Setter-Methoden wenn ein Container Instanzattribut ist



  • Servus,

    ich habe ein Objekt 'myobj' mit dem Attribut 'mystrings' hat, das ist ein Vektor aus Strings. 'mystrings' war vorher public. Wie muss die getter- und setter-Methode lauten, damit ich den gleichen Effekt habe und ich jetzt 'mystrings' als private festlege, vorher hatte ich das Attribut durch this->myobj.mystrings erwischt?

    Kennt einer einen guten Link, unter dem ich das kompakt nachlesen kann, nach welchen Kriterien man hier zu einer Lösung kommt?

    Danke vorab.



  • Oha, da steht nun sogar, dass ich die Accessor-Methoden meiden sollte ... das wundert mich:
    http://de.wikibooks.org/wiki/C++-Programmierung/_Eigene_Datentypen_definieren



  • Weil meistens myobj.mystrings.pushback("Birke"); schlechter ist als meinWald.pflanze("Birke");



  • volkard schrieb:

    Weil meistens myobj.mystrings.pushback("Birke"); schlechter ist als meinWald.pflanze("Birke");

    Sorry, das habe ich nicht verstanden.



  • Jay1980 schrieb:

    Oha, da steht nun sogar, dass ich die Accessor-Methoden meiden sollte ... das wundert mich:
    http://de.wikibooks.org/wiki/C++-Programmierung/_Eigene_Datentypen_definieren

    Das ist Müll... (jedenfalls in dieser kurzen, unbegründeten allgemeingültigen Formulierung)
    In deinem Fall kapselst du ja einen kompletten vector, anbieten willst du evtl. nur das Schreiben und lesen einzelner Werte. vector kennt nicht nur das Ersetzen von Werten oder Zugreifen auf Index - da gibts so was böses wie clear()! Wenn es dir wurscht ist, und du dem Nutzer vollen Zugriff auf den Vector geben willst (und ihm dadurch dein Vertrauen aussprichst, dass er nichts böses macht) - gut, mach ihn public...

    Was du dir überlegen solltest: Ist es wirklich wichtig, dass der Benutzer meiner Klasse diesen Indexzugriff (in welcher Form auch immer) machen kann? Könnte man das komplett verstecken? Das kannst nur du entscheiden, da du den Code hast und den Context kennst...



  • Jay1980 schrieb:

    volkard schrieb:

    Weil meistens myobj.mystrings.pushback("Birke"); schlechter ist als meinWald.pflanze("Birke");

    Sorry, das habe ich nicht verstanden.

    Code soll lesbar sein. :xmas2: :xmas2:



  • Okay, das heisst ich muss entscheiden, ob ich dem Nutzer den Vector oder nur einzelne Elemente anbiete. Entscheide ich mich für die Elemente, dann muss ich halt überlegen, wie bei allen, ob ich const, Referenzen, Zeiger oder den Wert herausreiche. Will ich echt den Vektor rausgeben, dann sollte ich keine getter- oder setter schreiben, sondern direkt das Attribut public setzen - richtig?

    Hm, irgendwie interessiert es mich doch ob es eine Option für einen setter gibt, der genau das gleiche ausdrückt wie die public-lassen-Variante.



  • Jay1980 schrieb:

    volkard schrieb:

    Weil meistens myobj.mystrings.pushback("Birke"); schlechter ist als meinWald.pflanze("Birke");

    Sorry, das habe ich nicht verstanden.

    Den Nutzer des myobj-Objekts sollte es nicht kümmern, wie die Strings verwaltet werden. Er braucht lediglich eine Funktion, um einen neuen String hinzuzufügen. Jeder sollte sich um seine eigenen Sachen kümmern.



  • Okay, wenn ich dem Nutzer das clear() erlauben will, dann sollte das eurer Meinung nach so aussehen oder?

    // geforderte Methoden, siehe c-plusplus.net/forum/p2151222#2151222
      // results.pairDependanciesList.clear();
      void clearPairDependanciesList();
    
    private:
    
      /** Liste aller Abhaengigkeiten, U(x,y) */
      std::vector<resultsPairDependancyItem> pairDependanciesList;
    
      /** Wert zum zu pickenden Perzentil in Properties-Objekt */
      double percentileToPickCutoff;
    };
    
    void Results::clearPairDependanciesList(){
      this->pairDependanciesList.clear();
    }
    

    ... ist das so ideal in dem Fall 'void' zurück zu geben?

    UPDATE: noch eine weitere Frage, bei der ich gern Feedback hätte:
    * will ich doch den ganzen Vector rausgeben, damit ein Nutzer den Zugriff über at() und über size() nutzen kann, ist dann diese Methode so in Ordnung:

    std::vector<resultsPairDependancyItem>& getPairDependanciesList(){
        return this->pairDependanciesList;
      }
    


  • wenn er nur lesend darauf zugreifen soll, dann machst das ganze const


Anmelden zum Antworten