Copier un pointeur unique dans une classe
Copier une classe qui contient un pointeur unique en tant que membre nécessite une attention particulière. Un pointeur unique ne peut pas être partagé, ce qui nécessite soit une copie complète de son contenu, soit une conversion en pointeur partagé.
Copie approfondie
L'approche de copie approfondie crée un nouveau pointeur unique et l'initialise avec une copie du contenu du pointeur d'origine :
class A { std::unique_ptr<int> up_; public: A(int i) : up_(new int(i)) {} A(const A& a) : up_(new int(*a.up_)) {} };
Ici, le constructeur de copie de A en profondeur copie l'int pointé par le pointeur unique d'origine.
Conversion en pointeur partagé
Vous pouvez également convertir le pointeur unique en pointeur partagé, ce qui lui permet de être partagé entre plusieurs objets :
class B { std::unique_ptr<int> up_; public: B(int i) : up_(new int(i)) {} B(const B& b) { up_ = std::make_shared(*b.up_); } };
Dans cet exemple, le constructeur de copie de B convertit le pointeur unique en un pointeur partagé, permettant à plusieurs copies de B d'accéder aux mêmes données sous-jacentes.
Autres opérateurs
Pour travailler de manière transparente avec des conteneurs, comme std::vector, des opérateurs supplémentaires sont généralement requis :
Déplacer Constructeur :
B(B&& b) { up_ = std::move(b.up_); }
Copier l'affectation :
B& operator=(const B& b) { up_ = std::make_shared(*b.up_); return *this; }
Déplacer Affectation :
B& operator=(B&& b) { up_ = std::move(b.up_); return *this; }
Ces opérateurs garantissent que les objets peuvent être attribués et copiés en toute sécurité dans divers contextes.
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!