Ich weiß, dass es Methoden gibt, die verhindern, dass eine Klasse auf dem Heap erstellt wird, indem verhindert wird, dass der Benutzer den Operator new
und delete
verwendet. Ich versuche genau das Gegenteil zu tun. Ich habe eine Klasse, die verhindern soll, dass der Benutzer eine Instanz davon im Stack erstellt, und dass nur Instanzen, die mit dem Operator new
gestartet wurden, kompilieren. Genauer gesagt möchte ich, dass der folgende Code während der Kompilierung einen Fehler erhält:
Von der Suche im Internet fand ich diesen Vorschlag, wie es geht:
%Vor% Was ich nicht verstehe ist, warum das funktionieren sollte. Warum sollte der Destruktor aufgerufen werden, während eine Instanz von MyClass
erstellt wird?
Wenn myclass
das Ende seines Bereichs erreicht (das nächste }
), ruft der Compiler den Destruktor auf, um ihn vom Stapel zu entfernen. Wenn der Destruktor jedoch privat ist, kann auf den Destruktor nicht zugegriffen werden, sodass die Klasse nicht auf dem Stapel platziert werden kann.
Ich mag das Aussehen von delete this
nicht. Im Allgemeinen denke ich, dass Objekte sich nicht selbst zerstören sollten. Vielleicht ist ein besserer Weg, einen privaten -Konstruktor für Ihre Klasse zu haben, dann verwenden Sie eine statische Funktion, um eine Instanz zu erstellen.
Warum sollte der Destruktor aufgerufen werden, während eine Instanz von
MyClass
erstellt wird?
Es ist nicht. Sie muss jedoch automatisch aufgerufen werden, wenn die Instanz ihren Gültigkeitsbereich verlässt. Wenn es privat ist, darf der Compiler diesen Code nicht erzeugen, daher der Fehler.
Wenn Sie der Ansicht sind, dass der Destruktor privat ist, ist eine andere Möglichkeit, eine Klasse auf dynamische Zuweisung zu beschränken, alle Konstruktoren privat zu machen und nur MyClass::create()
-Funktionen zurückzugeben, die dynamisch zugewiesene Objekte zurückgeben:
Beachten Sie, dass das Zurücksetzen nackter Zeiger auf Objekte, die gelöscht werden müssen, verpönt ist. Sie sollten stattdessen intelligente Zeiger zurückgeben:
%Vor%Immer wenn eine lokale Variable den Gültigkeitsbereich verlässt, wird sie zerstört. Und bei der Zerstörung wird der Zerstörer des Objekts genannt. Hier ist der Umfang der Hauptfunktion. Wenn das Programm beendet wird, wird der Destruktor des Myclass-Objekts
aufgerufenEs ist nicht. Der Compiler versucht, den Destruktor aufzurufen, wenn er den Gültigkeitsbereich verlässt, und zeigt auf die Codezeile, die diesen Effekt erzeugt, was viel nützlicher ist, als auf das Ende der Funktion zu zeigen.
Tags und Links c++ class-design