Destruktor aus Memberfunktion aufrufen?
-
Also sowas wie "isDestroyed"? Dann ist mein Vorschlag OK?
-
isDead oder isAlive sieht man alle Nase lang.
-
hasCollided könnte doch auch gehen, wenn das die Semantik ist. Manche Sachen überstehen ja vielleicht auch mehrere Kollisionen.
-
fdfdg schrieb:
hasCollided könnte doch auch gehen, wenn das die Semantik ist. Manche Sachen überstehen ja vielleicht auch mehrere Kollisionen.
Das verbessert nur wenig.
boost::ptr_vector<T> myTs; ... t-> hallo( ); if ( t-> hasCollided( ) ) if ( t-> isDead( ) ) myTs. erase( t );
-
Collided ist auch nicht gut. Das ist eher ein Event. Denn normalerweise passieren ständig Kollisionen (mit dem Bode, einem Mitspieler, einem Objekt usw.). Das bedeutet in den meisten Fällen noch nicht, dass das Objekt gestorben ist. isDead, isAlive finde ich gut.
-
Was ist der Vorteil von ptr_vector<T> gegenüber vector<T*>?
-
Er ruft delete für dich auf.
-
destrict0r schrieb:
Was ist der Vorteil von ptr_vector<T> gegenüber vector<T*>?
Automatische Aufräumung (kein
deletenotwendig), Exceptionsicherheit und direkte Dereferenzierung (*itristT&und nichtT*).Ausführlich sind die Vorteile hier aufgelistet.
-
314159265358979 schrieb:
Er ruft delete für dich auf.
Wann?
-
destrict0r schrieb:
314159265358979 schrieb:
Er ruft delete für dich auf.
Wann?
Sobald du das Objekt aus dem Container entfernst, mit
container.erase(iter).
-
Zu beachten: Im Unterschied zu
std::vector<T*>werden die Objekte aber kopiert, wenn du den Container kopierst! Oft will man das aber nicht. Um ungewolltes Kopieren zu vermeiden, kannst du deine Klasse T nicht-kopierbar machen, z.B. von boost::noncopyable erben lassen.
-
fdfdg schrieb:
Zu beachten: Im Unterschied zu
std::vector<T*>werden die Objekte aber kopiert, wenn du den Container kopierst! Oft will man das aber nicht...Wobei man fairerweise sagen muss, das viele sich keine Gedanken über den Kopieraufwand machen - und das in beide Richtungen (Die einen die grundsätzlich alle Kopien vermeiden wollen, und dies auch an Stellen wo Kopien unproblematisch sind, als auch die, die Kopien auch dort einsetzen wo man massiv sparen könnte).
Bevor ich auf einen std::vector<T*> zurückgreife, würde ich zumindest die ptr-Container von Boost in betracht ziehen (Sofern der Container auch der Besitzer sein soll).
-
fdfdg schrieb:
Im Unterschied zu
std::vector<T*>werden die Objekte aber kopiert, wenn du den Container kopierst! Oft will man das aber nicht.Noch viel weniger will man aber
std::vector<T*>kopieren, falls die Zeiger besitzend sind. Nur kann man das nicht verhindern.Aber der Hinweis mit
boost::noncopyableist gut, oft werden die Pointer-Container nämlich zur Speicherung von Objekten mit einer Identität (z.B. polymorph und ohne Wertsemantik) verwendet. Da könnte man immer noch Clone-Funktionen einsetzen, um Kopien ohne Kopierkonstruktor zu erstellen.