C ++, verhindert, dass die Klasseninstanz auf dem Stapel erstellt wird (während der Kompilierung)

7

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:

%Vor%

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?

    
eladidan 22.06.2010, 10:25
quelle

5 Antworten

21

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.

%Vor%     
AshleysBrain 22.06.2010, 10:28
quelle
12
  

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:

%Vor%

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%     
sbi 22.06.2010 10:27
quelle
1

Wenn die Instanz den Gültigkeitsbereich verlässt, muss sie mit dem Destruktor zerstört werden. Zeiger auf Instanz führt dies nicht aus.

    
berkus 22.06.2010 10:28
quelle
1

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

aufgerufen     
Pardeep 22.06.2010 10:29
quelle
1

Es 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.

    
Marcelo Cantos 22.06.2010 10:29
quelle

Tags und Links