CList als Übergabeparameter: Gültigkeitsbereich der CList-Objekte?
-
Hallo!
Ich schreibe eine Methode, die ein CList-Objekt per Call-by-Reference erwartet und mit Einträgen befüllt:
typedef CList <CString, CString> beispielListe; void eineKlasse::eineMethode(CList& eineListe){ CString stringEins = L"Erster String"; CString stringZwei = L"Zweiter String"; eineListe.AddHead(stringEins); eineListe.AddHead(stringZwei); return; }
Da die CStrings stringEins, stringZwei ja eigentlich nur lokal/temporär angelegt werden und nach Verlassen der Methode wieder gelöscht werden, frage ich mich, ob diese Vorgehensweise überhaupt richtig ist. Fügt die CList nur einfach die Zeiger auf die CString-Objekte in die Liste ein oder kopiert sie die CString-Objekte?
Wenn das so nicht geht, wie kann ich die Liste mit Einträgen füllen, die anschließend (nach Aufruf der Methode) auch noch existieren/gültig sind?
Vielen Dank im Voraus für Eure Hilfe!
Gruß Roger Wilco
-
Es macht Kopien!
Ich wüsste kein aktuelles Control von Windows, dass einen Zeiger auf ein LPCSTR weiter nutzt bzw. speichert. Es werden zu 99,9999% (geschätzt) Kopien erzeugt.
-
Danke, ich habe es nur bezüglich CStringList schwarz auf weiß gefunden, dass Kopien angelegt werden.
Bei CList habe ich die Info nicht gefunden, daher habe ich nachgefragt.
-
Roger Wilco schrieb:
Danke, ich habe es nur bezüglich CStringList schwarz auf weiß gefunden, dass Kopien angelegt werden.
Bei CList habe ich die Info nicht gefunden, daher habe ich nachgefragt.
1. Sorry: Ich habe CListCtrl gelesen, oder zumindest gedacht Du übergibst Deinen CString an ein Control. Insofern muss man meine erste Antwort etwas umdeuten.
Bei Dir geht es um ein CList Template!2. Zu CList! Wenn Du eine Liste CList vom Typ CString definierst, dann werden auch CString gespeichert und nicht etwa Pointer oder Referenzen! Das ist aus der Definition schon mal klar.
Du bekommst was Du definierst. Eine CList von CString& geht nicht. Eine Clist von CString*, würde die Adressen speichern und nicht Kopien.
Dazu müsstest Du beim AddHead aber auch den AddressOf operator nutzen.
-
Martin Richter schrieb:
2. Zu CList! Wenn Du eine Liste CList vom Typ CString definierst, dann werden auch CString gespeichert und nicht etwa Pointer oder Referenzen! Das ist aus der Definition schon mal klar.
Du bekommst was Du definierst.Was also bedeutet, dass bei dem Aufruf
eineCListe.AddHead(einCStringObjekt);
eine Kopie vom String in einCStringObjekt gemacht wird und in einem eigenen (neuen) Objekt vom Typ CString gespeichert wird? Die Quelle der Methode AddHead() kann also anschließend gelöscht werden?