Designfrage
-
Hallo!
Ist es zulässig dass eine public Methode den Dtor des Objektes aufruft, wovon auch die Methode aufgerufen wurde?
Danke für eure Weisheiten!
-
Adam Ries schrieb:
Hallo!
Ist es zulässig dass eine public Methode den Dtor des Objektes aufruft, wovon auch die Methode aufgerufen wurde?
Danke für eure Weisheiten!
ja, wenn der Dtor virtuell ist oder der dynamische Typ des Objekts mit dem statischen Typ in der Methode übereinstimmt (eigentlich ist es immer zulässig, wenn diese Bedingungen aber nicht erfüllt sind, dürfte in aller Regel ein Programmierfehler vorliegen). Jeder Zugriff auf Member des Objektes oder der Aufruf anderer nicht-statischer Memberfunktionen auf diesem Objekt ist danach allerdings verboten.
P.S. Ich hoffe du versuchst nicht sowas:
struct T { T& operator=(const T& other) { this->~T(); new(this) T(other); return *this; } };Das ist legal und sehr böse.
-
Danke, ich bin mir aber nicht sicher ob ich das nun vollends verstanden habe.
Was ich meine ist folgendes:
class Blah { private: Vater* pappa; ... public: Blah() {} ~Blah() {} DeleteMe() {pappa->removeInstanceRef(this); delete this;} };
-
Das geht schon, allerdings kriegst du Ärger, wenn das Objekt nicht mit new erzeugt wurde, sondern entweder direkt lokal (also auf dem Stack, statt auf dem Heap), oder z.B. nur ein Teil eines Arrays ist, das mit new[] erzeugt wurde (der erste Fall ist der Wahrscheinlichere
)Felix
-
Das ganze wirkt auf mich ein wenig "merkwürdig". Kannst du mal ein bisschen genauer erklären, warum du meinst das zu brauchen. Vielleicht hast du ja irgendeinen Fehler in deinem Design und es gibt eine bessere Lösung, die ohne sowas wie delete(this) auskommt.