Maison > développement back-end > C++ > Comment puis-je transmettre en toute sécurité un `std::shared_ptr` de \'this\' d'un objet parent à son objet enfant en C ?

Comment puis-je transmettre en toute sécurité un `std::shared_ptr` de \'this\' d'un objet parent à son objet enfant en C ?

Susan Sarandon
Libérer: 2024-10-29 13:12:29
original
952 Les gens l'ont consulté

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

Comment utiliser std::shared_ptr pour transmettre une référence de "this"

Dans la programmation orientée objet, il est courant pour les objets pour entretenir des relations les uns avec les autres. Cela implique souvent des objets contenant des références les uns aux autres, permettant la communication et le partage de données. Une façon de gérer les références d'objets en C consiste à utiliser des pointeurs intelligents, en particulier std::shared_ptr.

Considérez le scénario hypothétique où la classe A contient une liste de références std::shared_ptr à des objets de classe B, où chaque objet B doit également contenir une référence à son objet A parent. Cela pose un défi : comment la classe A peut-elle transmettre en toute sécurité un std::shared_ptr d'elle-même (this) à son enfant B ?

Une approche simple pourrait consister à essayer quelque chose comme child->setParent(this); , mais c'est incorrect car ce n'est pas un std::shared_ptr valide. La solution réside dans l'utilisation de std::enable_shared_from_this.

Présentation de std::enable_shared_from_this

std::enable_shared_from_this est une classe de base qui permet aux objets de renvoyer un std ::shared_ptr référence à eux-mêmes. En héritant de std::enable_shared_from_this, la classe A acquiert la possibilité d'appeler .shared_from_this() pour obtenir un pointeur partagé vers sa propre instance.

Solution utilisant std::enable_shared_from_this

Dans le code modifié ci-dessous, la classe A est conçue pour hériter de std::enable_shared_from_this, et l'appel child->setParent() utilise désormais .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>
Copier après la connexion

Dans cette mise à jour code:

  • La classe A hérite de std::enable_shared_from_this, permettant l'utilisation de .shared_from_this().
  • .shared_from_this() renvoie un pointeur partagé vers l'instance de la classe A, qui est ensuite transmis en toute sécurité à l'objet B.
  • std::weak_ptr est utilisé pour la liste des enfants de la classe A afin d'éviter les dépendances circulaires et les fuites de ressources.

Cette approche résout le problème du passage d'un std::shared_ptr de "this" d'un objet parent A à son objet enfant B. En utilisant std::enable_shared_from_this et en gérant les dépendances circulaires avec std::weak_ptr, un mécanisme de partage de références sûr et efficace est obtenu.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal