liste von pointern kopieren.
-
guten tag, ich habe folgendes problem:
ich habe in einer klasse eine private liste
private: list<CMyClass*> m_MyList;und einen konstanten öffentlichen getter
public: list<CMyClass*> getMyList() const;der m_MyList zurückgibt (return m_MyList).
jetzt brauche ich eine kopie dieser liste. ich dachte ich mache es folgendermaßen:
list<CMyClass*> myList = getMyList(); for(list<CMyClass*>::const_iterator it = myList.begin(); it != myList.end(); it++) { // hier setze ich werte, die ich eigentlich nur lokal brauche... (*it)->setPosition(myVar); }leider muss ich feststellen, dass die werte die ich in der for-schleife setze, tatsächlich in der echten m_MyList ankommen!
dh. meine original-werte in m_MyList werden überschrieben, was nicht sein darf!wie bekomme ich denn ansonsten eine nur lokal gültige kopie meiner liste, wenn nicht so??
vielen dank und schöne grüße
-
Der Copy-Ctor der list<> kopiert nur die Elemente IN der Liste, das heißt in deinem Fall die Adressen, die dort eingetragen sind. Darum, die Objekte hinter diesen Adressen zu kopieren, mußt du dich selber kümmern (Randfrage: Von wo bekommst du deine CMyClass-Objekte? Und warum muß es unbedingt eine Liste von Zeigern sein?).
-
du kopierst die pointer in deiner liste....
und hast so auf die objekt zugriff aus der original liste...
und überschreibst so die orginal objekte...
-
dh wenn ich eine kopie der daten haben will, muss ich die pointer dereferenziert in eine lokale liste schreiben?
cstoll: die liste wird an einer anderen stelle mit pointern auf objekte der klasse CMyClass gefüllt, für uns macht diese konstruktion an dieser stelle tatsächlich sinn, ich müsste jedoch zu weit ausholen um dies zu erleutern..
-
kopie:
list<CMyClass> tmp; for(list<CMyClass*>::const_iterator it = m_MyList.begin(); it != m_MyList.end(); it++) { //Kopie erstellen tmp.push_back(*(*it)); }kopie iterieren:
for(list<CMyClass>::const_iterator it = tmp.begin(); it != tmp.end(); it++) { it.setPosition(myVar); }
-
meiname schrieb:
dh wenn ich eine kopie der daten haben will, muss ich die pointer dereferenziert in eine lokale liste schreiben?
Ja.
cstoll: die liste wird an einer anderen stelle mit pointern auf objekte der klasse CMyClass gefüllt, für uns macht diese konstruktion an dieser stelle tatsächlich sinn, ich müsste jedoch zu weit ausholen um dies zu erleutern..
OK, wenn es Sinn macht, will ich nichts gesagt haben. Aber mir fallen auf Anhieb nur drei Gründe ein, so etwas machen zu wollen.
-
ah in ordnung, das verstehe ich.. klingt plausiebel! vielen dank euch beiden!
noch eine frage, gibt es einen unterschied zwischen tmp.push_back(*(*it)) und tmp.push_back(**it)? ich sehe da jetzt direkt keinen, oder?
cstoll: das hier ist bestimmt einer deiner drei gründe

-
soviel ich weis (sorry wenn ich mich irre) ist in der iterator Klasse der operator*() überschieben, welcher nich den Inhalt des Iterator Objekt zurückliefst, sondern da Objekt der Objektliste welche iterierst wird. Mit dem weitern sterh wird ja dann der inhalt des Objektzeiger zurückgeben... deswegen kapsele ich das mit Klammern...
-
meiname schrieb:
noch eine frage, gibt es einen unterschied zwischen tmp.push_back(*(*it)) und tmp.push_back(**it)? ich sehe da jetzt direkt keinen, oder?
Eigentlich nicht - die Dereferenzierung steht sowieso schon recht weit oben auf der Rangliste, da mußt du nur Klammern setzen, wenn du auf das dereferenzierte Objekt einen höheren Operator anwenden willst (z.B. Post-Inkrement oder Member-Zugriff).
cstoll: das hier ist bestimmt einer deiner drei gründe

Mal sehen. Die drei Gründe wären:
- Polymorphie
- Objekte müssen in mehreren Containern parallel verwaltet werden
- das Kopieren der Objekte ist extrem aufwendig oder technisch nicht möglich
Ist deiner dabei?
-
schön, dass das forum wieder läuft..
das dereferenzieren hat funktioniert und mich ein gutes stück weiter gebracht. vielen dank euch beiden für die erstaunlich schnellen antworten und die mühe!!
ja und wir haben tatsächlich sogar zwei deiner gründe hier angewandt. zum einen gibt es polymorphe klassen und zum anderen werden auch die objekte anderer klassen parallel in listen, also containern verwaltet. das macht es für mich auch so kompliziert, da ich noch nicht sehr lange im job bin und auch recht wenig erfahrung mit c++ habe.
also, nochmal vielen dank und schöne grüße aus dem rheinland!