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?

Wie kann ich in C sicher einen „std::shared_ptr' von „this' von einem übergeordneten Objekt an sein untergeordnetes Objekt übergeben?

Susan Sarandon
Freigeben: 2024-10-29 13:12:29
Original
952 Leute haben es durchsucht

How can I safely pass a `std::shared_ptr` of

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>
Nach dem Login kopieren

In dieser Aktualisierung Code:

  • Klasse A erbt von std::enable_shared_from_this und ermöglicht die Verwendung von .shared_from_this().
  • .shared_from_this() gibt einen gemeinsamen Zeiger auf die Instanz von Klasse A zurück, welches dann sicher an das B-Objekt übergeben wird.
  • std::weak_ptr wird für die Kinderliste in Klasse A verwendet, um zirkuläre Abhängigkeiten zu verhindern und Ressourcenlecks zu vermeiden.

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!

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