J'ai besoin d'écrire un constructeur de copie qui transférer également la propriété d'un membre unique_ptr de l'objet en cours de copie. La situation est la suivante: Comment puis-je implémenter le constructeur de copie pour A code>? p> p>
3 Réponses :
Votre intention ou votre approche est fausse, je suppose.
La copie-constructeur est destiné à créer un em> copier em> de l'argument, mais comme Par conséquent, vous devez: P> Il y a aussi une troisième option, qui consiste à effectuer une copie de l'objet pointée par le constructeur de copie unique_ptr dans la copy-constructeur, c'est-à-dire: p> unique_ptr code> maintient la propriété excédentaire On ne peut pas en faire une copie. Vous pourrait em> faire en fait un membre unique_ptr
mutable code>, puis déplacez la ressource qu'il pointe sur le constructeur de copie mais qui serait absolument insensé (c'est ce que
std :: auto_ptr code> fait et c'est pourquoi il est obsolète). P>
unique_ptr code> à
Shared_ptr code>, mais seulement si c est en réalité destiné à être partagé li>
ul>
A::A(const A& a) : c_(std::unique_ptr<C>(a.c_ ? new C(*a.c_) : nullptr)) {
}
Je n'appellerais pas l'intention tort. Il convient parfaitement à créer une interface de modélisation A type régulier i> que le type emballé ne peut pas exposer naturellement.
Je ne suis pas d'accord avec toi. Vous pouvez copier un objet qui contient uniques_ptr. Par exemple, je pourrais mettre en œuvre une classe LinkedList qui contient uniques_ptr en tant que pointeur pour l'élément suivant. Cela signifie-t-il que je ne peux pas ou ne devrait pas copier une liste aimée? Je souhaiterais peut-être copier la liste liée elle-même et enregistrer cette copie dans le fichier unique_ptr de l'objet copié
@Davidhaim, mais op veut transférer la propriété en copy-constructeur - c'est ce que le titre de la question dit. Je considère que c'est une mauvaise approche.
@Davidhaim en fait, Adam Romanek a raison parce que mon intention est de transférer la propriété, de ne pas copier l'objet pointé par le fichier unique_ptr. Puis-je demander un exemple de constructeur de déplacement pour cet exemple?
@Gabrielecswoosh, Ici vous avez: Melpon.org/wandbox/permlink/bbvgsx31iuofzf4s . Veuillez noter que le compilateur génère le même code pour vous par défaut lorsque vous avez un type de déplacement uniquement en tant que membre, par exemple. unique_ptr: Melpon.org/wandbox/permlink/7alooxzsomoslifa (NOTE AUCUNE COPIE / MOVE Constructeurs dans un et cela fonctionne toujours comme prévu)
Merci, en fait, j'ai d'autres variables membres dans un type qui ne se déplacent pas seulement (c'est-à-dire un flotteur et un int), alors j'ai besoin de l'écrire!
techniquement, à
" strong> Écrivez un constructeur de copie qui transférer également la propriété d'un membre unique_ptr de l'objet en cours de copie p> blockquote>
Vous pouvez simplement faire ceci: p>
xxx pré> car un constructeur de copie peut également avoir cette signature, plus deux autres, en plus du plus conventionnel
Mauvais (const mauvais &) code>. P>
J'ai nommé que la classe
mauvais code> parce que c'est vraiment mauvais, il n'a pas de sens de faire cette chose sauf en tant que sabotage de quelqu'un Code d'autre. p>
au lieu d'un constructeur de copie qui ne copie pas, P>
implémente un constructeur de déplacement qui se déplace em> ou p> li>
Implémentez un constructeur de copie ordinaire qui copie em> ou p> li>
changer la conception de la classe à par exemple. propriété partagée em>. p> li> ul> p>
Évidemment, vous ne pouvez pas simplement faire une affectation de dans cas 1 strong> Ce que vous cherchez est un constructeur de déplacement, et le constructeur de déplacement par défaut fonctionnera bien. Donc, vous n'avez pas besoin d'écrire un code, vous pouvez simplement faire: p> Notez que dans après avoir défini cela dans Notez que cela dépend du constructeur de copie dans cas 3 strong> vous Besoin de modifier fondamentalement modifier Votre construction de et maintenant std :: unique_ptr code> s car son opérateur d'affectation est supprimé. Ceci est intentionnel de forcer le programmeur à définir le comportement qu'il veut.
C _ code>, invalidant l'élément d'origine. LI>
c _ code>, conservant la validité des éléments d'origine. LI>
c _ code> de sorte que les éléments nouveaux et originaux font référence au même objet. LI>
ol>
Temp code> n'est pas valide après sa déplacement . EM> P>
A code> pour créer une copie du
C _ code>: p>
A code> vous pouvez faire: p>
C code> est fonctionnel. em> p>
A code> à partir d'un
std :: unique_ptr code> à l'aide d'un
std :: partagé_ptr code>, donc la définition de
c_ < / code> deviendrait: p>
c _ code> serait identique à ce que vous utilisez déjà pour le
std :: unique_ptr code> version de
c _ code>. Ainsi, en utilisant les implémentations par défaut que vous pouvez faire: p>
foo code> et
bar code> point sur le même
C code> objet et proportionnez-la. Cet objet partagé ne sera pas supprimé tant que tout
partagé_ptr code> S réféencage a été supprimé. P> p>
Donc, lorsque vous faites une copie, vous voulez rendre l'original invalide? Je suggérerais de supprimer le constructeur de copie et de rendre la classe mobile uniquement.
Si, avec l'original, vous voulez dire que l'objet original a oui, il devrait être "Transferref" en tant que membre de la classe B. Pouvez-vous vous donner un exemple de cela?
@GabrielecswoShsosh passez un peu de temps à lire les questions / réponses sur le Tag Motion-Sémantique .