Heim > Backend-Entwicklung > C++ > Hauptteil

Warum kann „shared_from_this' nicht in einem Konstruktor verwendet werden?

Mary-Kate Olsen
Freigeben: 2024-11-08 12:32:02
Original
184 Leute haben es durchsucht

Why Can't `shared_from_this` Be Used in a Constructor?

shared_from_this-Konstruktorbeschränkung: Technische Erklärung

Im Gegensatz zu häufigen Missverständnissen ist die Unfähigkeit, shared_from_this in einem Konstruktor zu verwenden, auf technische Einschränkungen zurückzuführen. Um zu verstehen, warum, tauchen wir in die Interna seiner Implementierung ein.

shared_from_this basiert auf einem privaten Mitglied in der Basisklasse, enable_shared_from_this, um einen schwachen_ptr zu speichern. Dieser schwache_ptr wird jedoch erst ganz am Ende des Konstruktionsprozesses initialisiert. Das bedeutet, dass, wenn der Konstruktor für die abgeleitete Klasse (z. B. Person) ausgeführt wird, noch kein shared_ptr vorhanden ist, der auf das Objekt zeigt.

Um dies zu veranschaulichen, betrachten Sie den Codeausschnitt aus dem Buch:

class Person : public std::enable_shared_from_this<Person> {
   ...
};
Nach dem Login kopieren

Die Funktion „shared_from_this“ innerhalb der Klasse „Person“ würde versuchen, den versteckten „weak_ptr“ mithilfe des ersten „shared_ptr“ zu initialisieren, der auf ein Objekt vom Typ „Person“ zeigt. Da jedoch der Konstruktor für Person derzeit ausgeführt wird, existiert kein solcher shared_ptr.

Diese technische Einschränkung entsteht, weil der Konstruktor für shared_ptr aufgerufen werden muss, bevor eine Aktion für das Objekt ausgeführt wird, auf das verwiesen wird. Daher kann der shared_from_this-Mechanismus nicht im Konstruktor der abgeleiteten Klasse funktionieren, da zu diesem Zeitpunkt kein shared_ptr verfügbar ist.

Das obige ist der detaillierte Inhalt vonWarum kann „shared_from_this' nicht in einem Konstruktor verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage