Verständnis vector<pair<string,string> >/Pointer(strtok)



  • Hallo Leute,

    es geht sich um folgendes Beispiel:

    //innerhalb der main
    char * recvbuf = new char[10000];
    std::vector<std::pair<std::string,std::string> > vector1;
    //..
    //..
    //Socket-Recv mit recvbuf als angegebenen Buffer.
    recv(..,recvbuf,...); //zur Veranschaulichung
    
    XXXInstanz.Methode1(recvbuf, vector1); //<-----Darum geht es.
    
    class XXX
    {
    public:
    XXX();
    ~XXX();
    int Methode1(char * recvbuf, std::vector<std::pair<std::string,std::string> >   &vect);
    
    private:
    char * m_pch;
    char * m_pch2;
    
    /*
    Ist ein Pointer als Member, ok?
    Ich habe gelesen, dass man dabei den Kopierkonstruktor als private deklarieren muss, da dieser sonst automatisch aufgerufen wird?!
    Kann mir jemand vielleicht in einem Satz der Grund sagen - weshalb dies geschieht?
    */
    }
    
    XXX::XXX()
    {
        m_pch = new char;
        m_pch2 = new char;
    }
    
    XXX::~XXX()
    {
        delete m_pch2;
        delete m_pch;
    }
    
    XXX::Methode1(char * recvbuf, std::vector<std::pair<std::string,std::string> >  &vect)
    {
    /*
    Diese Methode erhält den Buffer
    Frage 1: Wenn ich einen char pointer auf einen dynamisch allokierten Speicherbereich habe und einer
    Funktion übergeben möchte, ist ein char* als Parameter richtig?!
    Da dieser ja dynamisch allokiert ist, müsste der Pointer auf den Buffer, so lange gültig sein, bis ich den Speicherbereich wieder freigebe.
    Verweist der übergebene Pointer somit direkt auf den Buffer?
    */
    
    pch = strtok(recvbuf,"#");
    pch2 = strtork(NULL,"#");
    vector1.push_back(std::make_pair(pch,pch2));
    /*
    std::vector<std::pair<std::string,std::string> >
    Frage 2:
    Werden im Vektor lediglich Verweise auf die verschiedenen std::strings 
    gespeichert oder wird der Konstruktor vom std::string automatisch aufgerufen 
    und die strings innerhalb des std::vectors automatisch initialisiert?
    Ich selber glaube schon ^^, wäre ja sosnt eine komische Definition des Vektors, wenn es dann doch nur Verweise wären....
    */
    
    return 0;
    }
    

    Es sollten keine Librarys genutzt werden, lediglicht die Standard-Template Library.
    Ich weiß, dass mir tieferes Wissen fehlt, aber deshalb frag ich ja 😃
    Zudem habe ich mich wirklich nur auf das nötigste beschränkt.

    Danke im voraus

    MfG Schnuckerlie


  • Mod

    Warum char*? Warum new? Warum strtok? Du sagst, du willst die STL benutzen, warum dann solche low-level Frickelei, wenn die STL das alles in gut und sicher bietet?



  • Zu Frage 1:
    Ja.
    Zu Frage 2:
    Im allgemeinen letzteres. Prinzipiell ist aber ein vector erstmal leer erstellt. Wenn du etwas hinzufügst wird normalerweise das neue Objekt per copy-constructor erstellt, (kann in c++11 abweichen).



  • Warum char*?
    - ich weiß, dass es z.B. u.a. Smart Pointer,etc. gibt(aber habe mich diesbezüglich noch nicht beschäftigt, gehe gerade erst ins Land der STL ^^)

    Warum new?
    - Weiß ich nicht, was für einen nachvollziehbaren Sinn dahinter steckt(In diesem Fall). Habe mal was Code auf nem alten FTP einiger Freunde aus nem alten Forum gefunden..)
    Und habe es rein aus Interesse mal gemacht, wollte bisschen mit Scope, Null-Pointern etc. rumspielen 🙂

    Warum strtok?
    - Gibt es in der STL eine Alternative?!

    Das Problem ist, dass ich mich erst seit ganz kurzer Zeit mit der STL beschäftige, fange gerade erst an sie zu erforschen ^^...

    Aber das sind jetzt einfache Dinge, die ich gerade aus reinem Interesse frage.


  • Mod

    zuckerlie schrieb:

    Warum char*?
    - ich weiß, dass es z.B. u.a. Smart Pointer,etc. gibt(aber habe mich diesbezüglich noch nicht beschäftigt, gehe gerade erst ins Land der STL ^^)

    Na, wenn es ein Lernprojekt ist, dann lern. Aber was neues, nicht altes C-Gefrickel/

    Warum new?
    - Weiß ich nicht, was für einen nachvollziehbaren Sinn dahinter steckt(In diesem Fall). Habe mal was Code auf nem alten FTP einiger Freunde aus nem alten Forum gefunden..)

    Schlechter Grund. Nimm vector.

    Warum strtok?
    - Gibt es in der STL eine Alternative?!

    std::string? Ok, ist streng genommen nicht STL, aber immerhin aus der Standardbibliothek und designtechnisch der STL ähnlich. Die algortihms bieten auch eine Menge Funktionen und sind STL. In string.h gibt es nichts, was es in C++ nicht gibt.



  • zuckerlie schrieb:

    Warum new?
    - Weiß ich nicht, was für einen nachvollziehbaren Sinn dahinter steckt(In diesem Fall). Habe mal was Code auf nem alten FTP einiger Freunde aus nem alten Forum gefunden..)

    Wenn du mit Code, den du mal gesehen hast, herumspielst, dann bitte nur, weil du verstehst, was da passiert und ein wenig üben möchtest. Nicht, weil du nicht verstehst, warum die Freunde sowas geschrieben haben. Schau dir nicht anderer Leute Stil ab, wenn du nicth beurteilen kannst, ob der Stil gut oder sinnvoll ist oder nicht.

    Das Problem ist, dass ich mich erst seit ganz kurzer Zeit mit der STL beschäftige, fange gerade erst an sie zu erforschen ^^...

    Dann forsche, obs für das was du machen möchtest, was in der Standardbibliothek gibt, statt auf bekannte Lösungen aus C zurückzugreifen.

    www.cppreference.com
    www.cplusplus.com/reference


Log in to reply