Heim >Backend-Entwicklung >C++ >Wie kann ich in C sicher einen „std::shared_ptr' von „this' von einem übergeordneten Objekt an sein untergeordnetes Objekt übergeben?
So verwenden Sie std::shared_ptr, um eine Referenz von „this“ zu übergeben
In der objektorientierten Programmierung kommt es häufig bei Objekten vor Beziehungen untereinander zu pflegen. Dabei handelt es sich häufig um Objekte, die Referenzen zueinander enthalten, was die Kommunikation und den Datenaustausch ermöglicht. Eine Möglichkeit, Objektreferenzen in C zu verwalten, ist die Verwendung intelligenter Zeiger, insbesondere std::shared_ptr.
Stellen Sie sich das hypothetische Szenario vor, in dem Klasse A eine Liste von std::shared_ptr-Referenzen auf Objekte der Klasse B enthält. wobei jedes B-Objekt auch einen Verweis auf sein übergeordnetes A-Objekt enthalten muss. Dies stellt eine Herausforderung dar: Wie kann Klasse A einen std::shared_ptr von sich selbst (this) sicher an ihr untergeordnetes Element B übergeben?
Ein einfacher Ansatz könnte darin bestehen, etwas wie child->setParent(this); auszuprobieren. , aber das ist falsch, da es sich nicht um einen gültigen std::shared_ptr handelt. Die Lösung liegt in der Verwendung von std::enable_shared_from_this.
Wir stellen vor: std::enable_shared_from_this
std::enable_shared_from_this ist eine Basisklasse, die es Objekten ermöglicht, einen std zurückzugeben ::shared_ptr Verweis auf sich selbst. Durch das Erben von std::enable_shared_from_this erhält Klasse A die Möglichkeit, .shared_from_this() aufzurufen, um einen gemeinsamen Zeiger auf ihre eigene Instanz zu erhalten.
Lösung mit std::enable_shared_from_this
Im folgenden geänderten Code wird Klasse A so eingestellt, dass sie von std::enable_shared_from_this erbt, und der Aufruf von child->setParent() verwendet jetzt .shared_from_this():
<code class="cpp">class A : public std::enable_shared_from_this<A> { public: void addChild(std::shared_ptr<B> child) { children.push_back(child); child->setParent(shared_from_this()); } private: // Note the use of std::weak_ptr here std::list<std::weak_ptr<B>> children; };</code>
In dieser Aktualisierung Code:
Dieser Ansatz löst das Problem der Übergabe eines std::shared_ptr von „this“ von einem übergeordneten A-Objekt an sein untergeordnetes B-Objekt. Durch die Verwendung von std::enable_shared_from_this und die Verwaltung zirkulärer Abhängigkeiten mit std::weak_ptr wird ein sicherer und effektiver Referenzfreigabemechanismus erreicht.
Das obige ist der detaillierte Inhalt vonWie kann ich in C sicher einen „std::shared_ptr' von „this' von einem übergeordneten Objekt an sein untergeordnetes Objekt übergeben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!