std::vector, referenzen und kopieren
-
Hallo,
ich hab ne klasse "queue", die einen member vom typ vector<event&> hat. queue hat eine methode, die ein per referenz übergebenes objekt in den vector einfügt. Damit nicht versehentlich eine referenz auf ein temporäres objekt gespeichert wird, muss ich dieses ja kopieren (oder nicht?).
Nun kann ich zwar per new ein objekt erzeugen, aber ich weiß nicht, ob nicht vielleicht eine von event abgeleitete Klasse übergeben wurde. Wie kann ich eine Kopie erzeugen, ohne den genauen typ zu wissen? Hab ich da nen Denkfehler drin?
Danke im voraus
geloescht
-
vector<event&>
Rede nicht so einen Mist. Das geht überhaupt nicht.
-
meinte vector<event*>
geleoscht
-
geloescht schrieb:
Hallo,
queue hat eine methode, die ein per referenz übergebenes objekt in den vector einfügt. Damit nicht versehentlich eine referenz auf ein temporäres objekt gespeichert wird, muss ich dieses ja kopieren (oder nicht?).Warum der Aufwand? Wer ein temporäres Objekt einfügt hat sein Leben verwirkt, fertig
Nun kann ich zwar per new ein objekt erzeugen, aber ich weiß nicht, ob nicht vielleicht eine von event abgeleitete Klasse übergeben wurde. Wie kann ich eine Kopie erzeugen, ohne den genauen typ zu wissen?
mit einer virtuellen clone()-Funktion. Du musst natürlich wissen, ob sich der Aufwand lohnt (s.o.)
-
hmm...
soll die clone() methode new benutzen? das gefällt mir nicht, ist das nicht "schlechter stil"?Warum der Aufwand? Wer ein temporäres Objekt einfügt hat sein Leben verwirkt, fertig [:)]
aber dann könnte ich doch nicht einmal mehr
queue foo; foo.push(event(12, "blabla"));
machen. Außerdem wird das queue vorausichtlich von mehreren methoden anderer objekte genutzt werden, sogar events selber sollen wiederum events pushen können (Folge-Events sozusagen).
geloescht
-
Achso, dann hab ich dich falsch verstanden. Ich dachte das wären alles Heap-Objekte. Ist bei Polymorphie eigentlich auch normal, naja ...
Dann fragt sich natürlich, wohin willst du die Objekte denn kopieren, wenn nicht auf den Heap?
-
der aufrufer der push-funktion will einfach ein event in den queue einfügen. der queue kopiert es (auf den heap) und speichert es in seinem vector. mit einer anderen methode von queue kann man dann wieder events vom queue nehmen und verarbeiten (sie verarbeiten sich bei mir eher selber).
Bei der push-funktion hbee ich das Problem, dass ich nicht weiß, wie ich die übergabe auf den heap kopiere. Bei new muss ich ja den typ angeben, was schlecht möglich ist, wenn ich garnicht weiß, welchentyp das übergebene event überhaupt hat.
Ich hoffe es wird nun etwas klarer.
geloecht
-
Mach doch gleich
myqueue.push(new event(foo, bar));
das Kopieren erübrigt sich dann.
-
Wenn du sowieso Zeiger auf dieses Objekt speicherst, wäre eine Kopie doch sowieso
überflüssig, vor allem weil in der Liste, dann doch nur eine Kopie und nicht mehr
das Original stehen würde.
-
Bashar schrieb:
Mach doch gleich
myqueue.push(new event(foo, bar));
das Kopieren erübrigt sich dann.
und wer deleted das objekt dann wieder? Soll queue es wieder deleten? queue kann ja nicht sicher sein, dass es wirklich mit new allokiert wurde...
SirLant schrieb:
Wenn du sowieso Zeiger auf dieses Objekt speicherst, wäre eine Kopie doch sowieso überflüssig, vor allem weil in der Liste, dann doch nur eine Kopie und nicht mehr das Original stehen würde.
Mit der Kopie könnte ich sichergehen, dass ich sie wirklich mit new allokiert habe, und könnte sie auch wieder in queue Klasse freigeben. Sonst hat die queue Klasse ja garkeine Ahnung, woher das Objekt kommt. Zeiger speichere ich sowieso nur wegen der Polymorphie...
geloescht
-
geloescht schrieb:
Soll queue es wieder deleten? queue kann ja nicht sicher sein, dass es wirklich mit new allokiert wurde...
Zum Beispiel. Denk dir was aus. Wenn du auf Sicherheit dieser Art bedacht bist, wieso benutzt du dann eigentlich C++?
-
Du musst die Queue durchgehen und deine Elemente selber wieder mit delete freigeben.
@Bashar: Javaianer unter uns?
MfG SideWinder
-
-
Bashar schrieb:
geloescht schrieb:
Soll queue es wieder deleten? queue kann ja nicht sicher sein, dass es wirklich mit new allokiert wurde...
Zum Beispiel. Denk dir was aus. Wenn du auf Sicherheit dieser Art bedacht bist, wieso benutzt du dann eigentlich C++?
Ich hab einfach Angst, etwas falsch zu machen und nachher dumm dazustehen. Überall wird man gewarnt alles wieder zu deleted und es ja nirgends zu vergessen, da war ich einfach etwas zögerlich. naja, ich werds dann wohl so machen. Ich finds aber ziemlich schade, dass man nicht irgendwie
new typ_von(foo)
machen kann.
SideWinder schrieb:
Javaianer unter uns?
Hab noch nie was mit Java geproggt
geloescht
-
In "Mehr Effektiv C++" gibts nen kapitel über das Problem, wenn man sichergehen
muss, dass das Objekt im Freispeicher liegt, ich weiß jetzt allerdings nicht mehr
genau wie das ging, müsst ich nacher mal nachschlagen (es sei denn sonst wer weiß es :D).