Maison >développement back-end >C++ >Comment gérer les pointeurs uniques lors de la copie d'une classe ?

Comment gérer les pointeurs uniques lors de la copie d'une classe ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-15 16:00:24698parcourir

How to Handle Unique Pointers When Copying a Class?

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!

Déclaration:
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