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
Libérer: 2024-12-15 16:00:24
original
698 Les gens l'ont consulté

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_)) {}
};
Copier après la connexion

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_);
   }
};
Copier après la connexion

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 après la connexion
  • Copier l'affectation :

    B& operator=(const B& b)
    {
     up_ = std::make_shared(*b.up_);
     return *this;
    }
    Copier après la connexion
  • Déplacer Affectation :

    B& operator=(B&& b)
    {
     up_ = std::move(b.up_);
     return *this;
    }
    Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal