Ich verstehe, dass es nicht möglich ist, einen shared_ptr zu erhalten, indem shared_from_this () vom Konstruktor einer Klasse aufgerufen wird, da das Objekt noch nicht konstruiert ist. Ist es jedoch möglich, vom Konstruktor ein weak_ptr für das Objekt zu erhalten? Einige Boost-Forenbeiträge, die eine "weak_from_raw ()" -Methode diskutieren, legen nahe, dass dies möglich sein könnte.
Bearbeiten: Verbessern Sie das Formular, indem Sie weak_from_raw Ссылка
diskutierenIch denke, worauf Sie verweisen ist dies . Das scheint nicht mit der Boost-Version verschmolzen zu sein (könnte falsch sein).
Von den Boost-Dokumenten :
Häufig gestellte Fragen
Q. Kann ein Objekt in seinem Konstruktor ein weak_ptr für sich selbst erzeugen?
A. Nein. Ein weak_ptr kann nur aus einem shared_ptr erstellt werden, und zum Zeitpunkt der Objektkonstruktion existiert noch kein shared_ptr für das Objekt. Selbst wenn Sie hierfür ein temporäres shared_ptr erstellen könnten, würde es am Ende des Konstruktors den Gültigkeitsbereich verlassen und alle Instanzen von weak_ptr würden sofort ablaufen.
Die Lösung besteht darin, den Konstruktor privat zu machen und eine Factory-Funktion bereitzustellen, die ein shared_ptr zurückgibt:
%Vor%Siehe: Ссылка
Das Problem besteht nicht darin, dass das Objekt nicht konstruiert ist. Das Problem besteht darin, dass shared_ptr nicht erstellt wurde. Wenn Sie nur ein shared_ptr erstellen und es irgendwo abschicken müssten, wäre alles in Ordnung. Wenn Sie versuchen, ein shared_ptr zu erstellen, das das gerade erstellte Objekt enthält. Es gibt keine Möglichkeit, die beiden zu verbinden, und Sie haben ein großes Problem.
Die Art und Weise, wie shared_from_this funktioniert, besteht darin, dass Sie davon ausgehen, dass Sie das Objekt als shared_ptr verwenden, bevor Sie shared_from_this aufrufen, um Zugriff darauf zu erhalten. Da der Konstruktor des Objekts noch nicht fertig ist und der shared_ptr damit nicht verbunden ist, können Sie shared_from_this nicht aufrufen.
Sie hätten genau das gleiche Problem mit dem weak_ptr.
Mit anderen Worten, dieses absurde Konstrukt würde funktionieren:
%Vor%Aber du willst das wirklich nicht machen.
Tags und Links c++ constructor boost shared-ptr weak-ptr