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>
Dans cette mise à jour code:
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!