PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ein Objekt in 2 Listen


Gast
2006-03-22, 17:28:51
Hi!


class element
{
string name;
list<element> inhalt;
}

list<element> e_liste1, e_liste2;

main()
{...
element e;
e.name = "ersteselement";
e_liste1.push_back(e);
e_liste2.push_back(e);
...}


Wie kann ich ein Objekt e in zwei Listen stecken, sodass ich wirklich nur ein Objekt e habe.
(Un-)Sinn: Zum Beispiel wird auf e in Liste e_liste1 schreibend (eg e_liste1.back().name = "Kuh";) zugegriffen, auf e_liste2 nur lesend.

Wenn ich e - wie oben im Code - in beide Listen 'pushe' und über eine der Listen das e ändere, dann bleibt das e in der anderen Liste unverändert. Soll aber nicht... :(

Gast
2006-03-22, 17:41:12
Achja, das soll C++ sein; und nach der geschlossenen, geschweiften Klammer der Klasse soll noch ein Semikolon stehen.

Pinoccio
2006-03-22, 17:43:54
Also so wie ich das sehe,m hast du in der Tat nur ein Element, nur halt zwei Zeiger/Referenzen drauf in den zwei verschiedenen Listen.

mfg Sebastian

Gast
2006-03-22, 18:19:23
[QUOTE=Gast]
element e;

Muß er da nicht "element e = new element();" schreiben? Sonst landest doch auf'm Stack, oder?

Simon
2006-03-22, 18:22:56
Das funktioniert so nicht. Wenn du was in eine std::list tust, wird eine Kopie deines Objects darin gespeichert. D.h. du mußt in deinen Listen entweder Zeiger/Referenzen verwalten oder es in beiden Listen ändern.

@Pinoccio: Leider falsch (s.o.).

@zweiter Gast: Ja und? Lass das Ding doch auf dem Stack. Und dein Vorschlag würde übrigens auch nicht gehen. Da fehlt der Derefenzierungsoperator.

€dit: damit der "kompetente Gast" nicht mehr so viel zu lachen hat :P

Man, bin ich froh, dass ich C++ los bin :P

Kompetente Gast
2006-03-22, 19:21:02
LOL So viele Leute, und so viel Bullshit... Und de Zeigeroperator ist auch n1 ;)

Im Grunde gibts nur Pointer oder Referenzen (hierzu nimmst du z.B. boost::ref / boost::const_ref). Wo der Speicher im Endeffekt alloziert wird musst du selbst entscheiden. Villeicht schaust dir mal das RAII-Idiom an, oder weihst uns in dein Konzept ein.

Grüße

Gast
2006-03-22, 19:30:44
list<element*> e_liste1, e_liste2;

main()
{...
element e;
e.name = "ersteselement";
e_liste1.push_back(&e);
e_liste2.push_back(&e);
...}

-zecki