Vektor eines Objekts durchlaufen lassen



  • classlearning schrieb:

    const vector<string>& variable1 = save.getData();
    

    und wenn ich das so mache, dann kann ich ja variable1 benutzen so als wenn ich die ganz normal mit

    variable1 ="teststring"
    

    deklariert hätte? irgendwie ist das so oder?

    nein, das ist nicht so. Ein std::vectorstd::string ist etwas anderes als ein std::string.



  • classlearning schrieb:

    vielen lieben dank out! und auch an die anderen.

    aber out:

    const vector<string>& = save.getData();
    

    bin ich jetzt blöd oder fehlt da nicht eine variable, so kann ich das doch dann garnicht ansprechen oder? oder wie gebe ich das dann aus?

    cout << ?????? << endl;
    

    Ja, stimmt natürlich, da war mein Kopf wohl wo anders, und das const bei der Methode hab ich auch vergessen. 🙄

    const vector<string>& getData() const
    {
         return Data;
    }
    int main()
    {
        const vector<string>& ori = save.getData();
    }
    


  • daddy_felix schrieb:

    classlearning schrieb:

    const vector<string>& variable1 = save.getData();
    

    und wenn ich das so mache, dann kann ich ja variable1 benutzen so als wenn ich die ganz normal mit

    variable1 ="teststring"
    

    deklariert hätte? irgendwie ist das so oder?

    nein, das ist nicht so. Ein std::vectorstd::string ist etwas anderes als ein std::string.

    ja natürlich ich bin mit meinem kopf auch woanderst heute das ist ja schlimm

    // wenn es const ist, dürfte das doch nicht gehen oder?? da sollte er doch schimpfen oder?
    // d.h. ich kann das nicht machen, allerdings wenn es nicht 'const' wäre dann schon?
    variable1.push_back("teststring");
    
    //aber ausgeben müsste doch dann ganznormal über
    cout << variable1[0] << endl;
    // gehen?
    


  • classlearning schrieb:

    ja natürlich ich bin mit meinem kopf auch woanderst heute das ist ja schlimm

    // wenn es const ist, dürfte das doch nicht gehen oder?? da sollte er doch schimpfen oder?
    // d.h. ich kann das nicht machen, allerdings wenn es nicht 'const' wäre dann schon?
    variable1.push_back("teststring");
    
    //aber ausgeben müsste doch dann ganznormal über
    cout << variable1[0] << endl;
    // gehen?
    

    Ja, ersteres funktioniert nicht wenn es const ist, da es den vector ja verändern würde. Letzteres kannst du natürlich machen, es verändert den vector ja nicht.



  • classlearning schrieb:

    // wenn es const ist, dürfte das doch nicht gehen oder?? da sollte er doch schimpfen oder?
    // d.h. ich kann das nicht machen, allerdings wenn es nicht 'const' wäre dann schon?
    variable1.push_back("teststring");
    

    Deswegen kommen solche Member Häufig in Paaren: const/non-const

    class speicher{
    public:
      const vector<string>& getData() const;
            vector<string>& getData();
    };
    


  • Furble Wurble schrieb:

    classlearning schrieb:

    // wenn es const ist, dürfte das doch nicht gehen oder?? da sollte er doch schimpfen oder?
    // d.h. ich kann das nicht machen, allerdings wenn es nicht 'const' wäre dann schon?
    variable1.push_back("teststring");
    

    Deswegen kommen solche Member Häufig in Paaren: const/non-const

    class speicher{
    public:
      const vector<string>& getData() const;
            vector<string>& getData();
    };
    

    Verstehe ich nicht. Macht doch gar kein Sinn. Zum einen kann ein non-const Objekt eine const-Methode aufrufen, zum anderen, wieso sollte eine get-Methode Daten ändern?



  • Verstehe ich nicht. Macht doch gar kein Sinn. Zum einen kann ein non-const Objekt eine const-Methode aufrufen, zum anderen, wieso sollte eine get-Methode Daten ändern?[/quote]

    Finde ich auch seltsam.



  • Aus einer Konstante kannst du keine nicht-konstante Referenz auf einen ihrer Member bekommen. Wenn du das bei einer Variablen des selben Typs aber haben willst, musst du das auf diese Weise explizit angeben. Damit beispielsweise

    obj.getData().push_back("foo");
    

    funktioniert.



  • aber warum in paaren ich kann doch einfach ne setfunktion schreiben die das macht...

    also ich verstehe den sinn jetzt hinter const schon, wenn ich die variable hole dann sollte eigentlich nur was gemacht werden aber nicht verändert.
    wenn ich die doch veränder will, will ich doch ne extra funktion haben. oder verstehe ich da jetzt was falsch?



  • Das macht schon Sinn. Denn der Zugriff auf einen vector per [] verändert ja den Vector erst einmal nicht (daher const) und erlaubt so die Verwendung in konstanten Methoden. ABER wenn man eine Veränderung durchführen möchte wird die nicht konstante Methode verwendet.

    Anders sieht es zum Beispiel bei std::map aus. Dort ist der []-operator nur als nicht konstante Variante vorhanden und kann somit in konstanten Funktionen nicht verwendet werden.

    Grob erklärt...



  • Du kannst die Funktion auf diese Weise stumpf überladen wie jede andere Funktion. Die Semantik ist die selbe wie bei zwei freien Funktionen der Form

    vector<string> const &getData(speichere const *this_ptr);
    vector<string>       &getData(speichere       *this_ptr);
    

    d. h., für Konstanten wird erstere und für Variablen letztere benutzt.


Anmelden zum Antworten