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);
-
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)
geloeschtda 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
-
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...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!"
-
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.