Implémentation de constructeurs de copie pour les classes avec des membres unique_ptr
Lorsque vous travaillez avec des classes qui utilisent une variable membre unique_ptr, l'implémentation d'un constructeur de copie devient cruciale. Dans cet article, nous aborderons les techniques de création de constructeurs de copie en C 11 pour de telles classes.
Comme unique_ptr ne peut pas être partagé, il est impératif soit de copier profondément son contenu, soit de le convertir en shared_ptr. L'exemple suivant illustre la copie approfondie :
class A { std::unique_ptr<int> up_; public: A(int i) : up_(new int(i)) {} A(const A& a) : up_(new int(*a.up_)) {} };
Dans cette approche, un nouveau unique_ptr est alloué et une copie du contenu du pointeur d'origine lui est attribuée.
Alternativement, on peut utiliser un constructeur de déplacement à la place d'un constructeur de copie :
A(A&& a) : up_(std::move(a.up_)) {}
Cependant, cette méthode introduit une sémantique différente, car elle transfère la propriété du unique_ptr de la source à l'objet cible.
Pour être complet, l'ensemble complet des opérateurs d'affectation serait :
A& operator=(const A&a) { up_.reset(new int(*a.up_)); return *this; } A& operator=(A&& a) { up_ = std::move(a.up_); return *this; }
La décision d'utiliser des constructeurs de copie ou de déplacement dépend du contexte. Si la classe est destinée à être utilisée dans un std::vector, le choix entre rendre la classe mobile uniquement ou copiable est influencé par le fait que le vecteur doit être le seul propriétaire des objets.
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!