Copie de classes avec des pointeurs uniques en C 11
Création d'un constructeur de copie pour une classe contenant un unique_ptr, un pointeur intelligent qui impose la propriété exclusive , pose des défis uniques. En C 11, la gestion des membres unique_ptr nécessite une réflexion approfondie.
Solution :
Pour implémenter un constructeur de copie, vous avez deux options :
-
Deep Copy : Créez une nouvelle copie du contenu de unique_ptr. Cela garantit que les deux objets possèdent leurs données indépendamment.
class A {
std::unique_ptr<int> up_;
public:
A(int i) : up_(new int(i)) {}
A(const A& a) : up_(new int(*a.up_)) {}
};
Copier après la connexion
-
Convertir en shared_ptr : Convertissez le unique_ptr en shared_ptr, ce qui autorise plusieurs propriétaires.
std::shared_ptr<int> sp = std::make_shared<int>(*up_);
Copier après la connexion
Supplémentaire Considérations :
-
Constructeur de déplacement : Au lieu d'un constructeur de copie, vous pouvez utiliser un constructeur de déplacement, qui transfère la propriété de unique_ptr.
A(A&& a) : up_(std::move(a.up_)) {}
Copier après la connexion
-
Surcharge des autres opérateurs : Pour un ensemble complet d'opérations, il est utile de surcharger les opérateurs d'affectation.
A& operator=(const A& a) { up_.reset(new int(*a.up_)); return *this; }
A& operator=(A&& a) { up_ = std::move(a.up_); return *this; }
Copier après la connexion
-
Considérations sur les vecteurs : Si vous avez l'intention d'utiliser votre classe dans un std::vector, décidez si le vecteur sera exclusivement propriétaire des objets. Vous pouvez appliquer un comportement de déplacement uniquement en omettant le constructeur de copie et les opérateurs d'affectation de copie.
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!