2016-07-27 24 views
-2

Angenommen, ein Objekt erstellt und besitzt (z. B. unique_ptr) ein Elementobjekt. Das Member-Objekt wird von einem asynchronen Ereignis durch eine Callback-Funktion von außen benachrichtigt, und wenn ein 'Ende'-Ereignis vorliegt, kann das Objekt zerstört werden. Was ist der allgemeine Weg für das Member-Objekt, das Besitzer-Objekt darüber zu informieren, dass das Member-Objekt jetzt zerstört werden kann?C++: Ein allgemeiner Weg für ein Objekt, seinen Besitzer zu benachrichtigen, sich selbst zu zerstören?

Die Callback-Funktion muss auch einen Wert zurückgeben. Bitte schauen Sie sich die vereinfachte Version des Codes an:

+1

Haben Sie etwas wie eine 'bool toBeDeleted() const;' in Ihrer 'Child' Klasse. –

+0

Sie müssen klären, was dieser "Elternteil" ist. Ist es ein Member-Variablen-Zeiger auf ein Objekt, das 'Child'-Instanzen aggregiert? Oder beziehen Sie sich auf die Basisklasseninstanz? – TerraPass

+1

Changed "Eltern" zu "Besitzer" für die Klarstellung. Hier ist keine Vererbung beteiligt. – MaxHeap

Antwort

1

Ich fürchte, Sie werden nicht gerne antworten, aber es ist eine Frage des Eigentums. Wenn ein Objekt A Objekt B, B besitzt, sollte nur durch A zerstört werden. Ihr "async call" sollte daher von A oder einem anderen Mitglied von A behandelt werden, das A teilt, um B zu löschen.

Jeder andere Weg der Zerstörung B ist im Grunde ein Hack. Kurz gesagt: Töte A nicht, wenn es einer anderen Klasse gehört.

0

Es gibt keine allgemeine Weg, dies zu tun. Der übliche Weg ist, dass der Konstruktor Child einen Zeiger/Verweis auf die Klasse Owner nimmt (es sieht so aus, als ob Sie dies bereits tun) und dann eine Funktion der Owner aufrufen, die den Besitzer anweist, das Kind zu löschen.

Wie in den Kommentaren erwähnt, muss die Child-Funktion dann sehr vorsichtig sein, was sie berührt, weil das Objekt gelöscht wurde.

Wenn Sie Child ein Freund von Owner machen, nicht wollen, sondern auch jemand möchte nicht anders als Child Aufruf dieser Funktion können Sie eine Schnittstelle bereitstellen, die Owner von leitet privat, und übergeben Child dann eine Zeiger auf diese private Schnittstelle stattdessen.