einfügen in objektliste (STL)



  • wie kann man objekte in ner liste einfügen so das man über die Listenelemente auf die objektmember zugreifen kann?

    iteratorofobjectlist->member;

    ich hab es schon versucht und bei google gesucht usw.
    aber wenn sich der Wert eines Attributes ändert sieht man das beim Zugriff über die Liste nicht? (also der alte Wert bleibt)

    client* chatter = new client(socket);
    liste.push_back(*chatter);
    

  • Mod

    liste.push_back(*chatter);
    

    damit legst du eine kopie an.



  • Also wenn es um das dynamische oder polymorphe an den Objekten gibt, dann nimm das hier.
    Ansonsten solltest du einfach normale Objekte in die Liste tun statt Pointer.

    Dies bezog sich vor allem auf das vorher geschriebene und dein Beispiel, deine Frage

    debian inside schrieb:

    aber wenn sich der Wert eines Attributes ändert sieht man das beim Zugriff über die Liste nicht? (also der alte Wert bleibt)

    hab ich nicht verstanden.



  • willst du vielleicht eher eine std::list<client*> statt einer std::list<client>? Denn mit deinem Code wird das Objekt kopiert, auf das chatter zeigt und dann in die liste eingefügt, nicht das objekt, dass du mit new erstellt hast. Übrigens kann es problematisch mit dem deleten werden, wenn du mit new erstellte objekte in eine liste einfügst, für die sich keine klasse verantwortlich fühlt (d.h. sie im destruktor löscht)
    geloescht



  • geloescht schrieb:

    willst du vielleicht eher eine std::list<client*> statt einer std::list<client>? Denn mit deinem Code wird das Objekt kopiert, auf das chatter zeigt und dann in die liste eingefügt, nicht das objekt, dass du mit new erstellt hast. Übrigens kann es problematisch mit dem deleten werden, wenn du mit new erstellte objekte in eine liste einfügst, für die sich keine klasse verantwortlich fühlt (d.h. sie im destruktor löscht)
    geloescht

    da schreibt man nen tcp server mit threads und datenbankzugriff und erkennt das man die grundlagen nicht versteht...
    ich melde mich wieder wenns klappt :p



  • so hatte wieder mal zeit um weiter zu machen

    das ganze läuft jetzt so und funktioniert auch ganz gut

    list<chatter*> liste;
    liste.push_back(new chatter(socket));
    

    wenn ich nun ein objekt aus der liste lösche ist auch dessen speicher wieder frei, oder?

    nochmals danke für die anregungen


  • Mod

    debian inside schrieb:

    so hatte wieder mal zeit um weiter zu machen

    das ganze läuft jetzt so und funktioniert auch ganz gut

    list<chatter*> liste;
    liste.push_back(new chatter(socket));
    

    wenn ich nun ein objekt aus der liste lösche ist auch dessen speicher wieder frei, oder?

    nochmals danke für die anregungen

    welches objekt meinst du? den zeiger, oder das objekt, auf das der zeiger zeigt 😉

    entfernst du den zeiger, wird nur dieser gelöscht - um das aufräumen des heap-objektes musst du dich selber kümmern (oder benutz boosts pointer container) - eine einfache aufräum funktion z.b.:

    list<chatter*> liste;
    // ... irgendwie füllen
    while ( !liste.empty() )
    {
        chatter* p = liste.back();
        liste.pop_back();
        delete p;
    }
    


  • reicht es wenn ich im objekt delete this; aufrufe?





  • debian inside schrieb:

    reicht es wenn ich im objekt delete this; aufrufe?

    Würde prinzipiell funktionieren, ist aber äußerst unschön und durchaus unnötig. (Siehe auch C++ FAQ Lite.)
    Nehm lieber einen von campers Vorschlägen...

    @.filmor

    http://www.progsoc.uts.edu.au/lists/progsoc/2000/October/msg00010.html schrieb:

    [...]
    I haven't got ARM (or a similar tome) handly but I suspect that modifying "this" in a member funcion is illegal. Either way, changing "this" in a member function will not affect the value of the pointer the function was called through. E.g.

    void zero_ptr(char* s)
    {
    // This line only changes the local version of s.
    s = NULL;
    }

    ...

    char *s = "Hello, world!";
    zero_ptr(s);
    printf(s); // Shows "Hello, world!"

    🙄


  • Mod

    If you want to use in it a constructor, ...

    delete this im konstruktor ist nicht nur eine schlechte idee sondern sogar völlig illegal - schliesslich existiert das objekt noch gar nicht.


Anmelden zum Antworten