"Rohdatentyp"



  • hav a break schrieb:

    Ethon schrieb:

    @Shade of Mine: Erstmal alles in einen Vector kopieren nur um swap nutzen zu können?
    Imo sehr fragwürdig.

    Du kopierst ja nicht den vector, sondern erstellst ihn.

    Argh, stimmt 😉



  • MyBuf::MyBuf(const char* text)
    : m_vector(text, text + strlen(text))
    {
      m_vector.push_back(0);
    }
    //...
    

    Gehts nicht auch so, @Shade?



  • Doch, so gehts auch.



  • Tachyon schrieb:

    Gehts nicht auch so, @Shade?

    Ja.
    Ich habe absichtlich beim 1. ctor die ursprüngliche Variante verwendet und beim 2. dann die korrekte mit initialisierung über iteratoren. Deine Variante ist deshalb auch die bessere.



  • Zwei Fragen hätte ich da noch:

    1. Das hier verstehe ich nicht.. (also warum der Befehl nicht innerhalb der geschweiften Klammern steht)

    MyBuf::MyBuf(const std::string& text)
    : m_vector(text.begin(), text.end())
    {
       m_vector,push_back(0);
       //zb so waere es schoener
    }
    

    2. Welchen Vorteil bringt das swap()? (Außer dass swap() jetzt von Außen zugänglich ist, aber es ging ja hier um den Unterschied zu *this = .. )


  • Mod

    cooky451 schrieb:

    1. Das hier verstehe ich nicht.. (also warum der Befehl nicht innerhalb der geschweiften Klammern steht)

    2. Welchen Vorteil bringt das swap()? (Außer dass swap() jetzt von Außen zugänglich ist, aber es ging ja hier um den Unterschied zu *this = .. )

    Zwei Stichworte zum nachschlagen:
    1. Initialisierungsliste
    2. Copy&Swap Idiom



  • Tachyon schrieb:

    MyBuf::MyBuf(const char* text)
    : m_vector(text, text + strlen(text))
    {
      m_vector.push_back(0);
    }
    //...
    

    Gehts nicht auch so, @Shade?

    In dem Fall geht's sogar noch einfacher:

    MyBuf::MyBuf(const char* text)
    : m_vector(text, text + strlen(text) + 1)
    {
    }
    //...
    

    Und mit "in dem Fall" meine ich ...

    Mit .c_str() würde ich sowas nicht machen, da AFAIK nirgends garantiert wird, dass 2x der selbe Zeiger zurückkommt wenn man 2x hintereinander .c_str() aufruft. Abgesehen davon ginge es mit .c_str() genau so (also m_vector(str.c_str(), str.c_str() + str.size() + 1) ).

    Und ja: vermutlich wird keine vernünftige Implementierung .c_str() so implementieren dass NICHT 2x der selbe Zeiger rauskommt, wenn man den String dazwischen nicht ändert... aber das ist halt keine Garantie.



  • Ok das mit der Initialisierungsliste ist ja wirklich ganz nett und vorteilhaft 🙂
    Das Stichwort Copy & Swap Idiom wurde hier schon mal genannt, allerdings muss ich irgendwie zugeben dass mir die Sinnhaftigkeit immer noch nicht so ganz klar ist..
    Ich glaube das muss man mir noch mal für Blöde erklären 😃

    Abgesehen davon ist mir aufgefallen dass viele hier

    char const* blubb
    

    statt

    const char* blubb;
    

    schreiben. Ist das so eine "C++ Schreibweise"? Weil vorher (C) habe ich das noch nie gesehen..



  • cooky451 schrieb:

    Ich glaube das muss man mir noch mal für Blöde erklären 😃

    Wäre vielleicht noch gut zu wissen, was dir daran Schwierigkeiten bereitet, damit wir nicht den Wikibooks-Artikel wiederholen müssen. Was genau verstehst du nicht?

    cooky451 schrieb:

    Abgesehen davon ist mir aufgefallen dass viele hier [...] schreiben.

    Beide Schreibweisen sind äquivalent. Ich denke nicht, dass eine davon eine spezifische Schreibweise von C++-Programmierern ist.



  • Den Teil "Motivation".



  • Eine Einführung zum Thema Exceptionsicherheit erhältst du im Artikel von Shade Of Mine. Ich empfehle ausserdem das Buch Exceptional C++ von Herb Sutter, darin findest du auch viele andere Tipps zu Programmiertechniken und Design.



  • cooky451 schrieb:

    Den Teil "Motivation".

    Mit Copy & Swap ist es viel einfacher den Assignment-Operator "korrekt" zu implementieren.
    Als Nebenprodukt fällt eine swap() Funktion ab, die auch oft praktisch ist.
    Der Code wird auch gleichzeitig besser wartbar, da man weniger Code wiederholt.


Anmelden zum Antworten