c++ constructeur de copie avec shared_ptr membres
De cplusplus.com:
Rarement, vous rencontrerez une classe qui ne contient pas de raw pointeurs
pourtant, le constructeur de copie par défaut n'est pas suffisant. Un exemple de ce
c'est quand vous avez une référence compté objet. boost::shared_ptr<> est
exemple.
Quelqu'un peut-il fournir des précisions sur ce? Si nous avons une classe contenant un boost::shared_ptr
, de ne pas obtenir la copie construit lorsque la classe devient exemplaire construit - et donc de ne pas le shared_ptr
constructeur de faire la bonne chose et augmenter le nombre de références? Le code suivant, par exemple, des copies Inner
correctement - pourquoi ne serait-ce pas le travail pour shared_ptr
?:
#include <iostream>
using namespace std;
class Inner
{
public:
Inner() { cout << "inner default constructed" << endl;}
Inner(const Inner& other) { cout << "inner properly copied" << endl;}
};
class Outer
{
Inner i;
};
int main() { Outer o; Outer p(o); return 0;}
L'oublier, c'est juste de la connerie. Faire semblant de ne pas mentionner shared_ptr. Je suppose que c'est encore une autre des raisons pour cplusplus.com est tellement vilipendé.
Donc de poser une question alors. Quand les gens disent "le constructeur de copie par défaut ne une copie superficielle", cela signifie "qu'il appelle la copie des constructeurs de tous les membres à tour de rôle" ou "il n'a tout simplement memcpy() sur l'instance de la classe"
Cette copie superficielle entreprise est juste déroutant. Il n'a tout simplement un membre de la sage-copie. Ce qui se passe réellement lors de la copie dépend des types de données des membres impliqués.
OriginalL'auteur Sideshow Bob | 2013-07-24
Vous devez vous connecter pour publier un commentaire.
La copie par défaut constructeur utilise le constructeur de copie pour chaque variable membre, ou bit à bit copie de types intégrés.
Si vous utilisez un pointeur partagé d'un certain type, le constructeur de copie va incrémenter l'partagé compter et à la fois l'original et les nouveaux objets pointent vers le même objet.
Dans certains cas, c'est ce que vous voulez; la copie du pointeur et correctement la gestion du compte de référence afin que les ressources puissent être libérées quand il n'est plus utilisé.
Le contexte de l'article cité est dans la copie d'un objet entier. Dans ce cas, chaque objet devrait avoir sa propre copie de ses sous-objets, et de ne pas partager des objets avec d'autres instances. Dans ce cas,
shared_ptr
est probablement le mauvais choix, et ne sera certainement pas de copie en profondeur le sous-objets.Le paragraphe est mal posé, mais je suis sûr qu'il parle de copie en profondeur mais en disant que
shared_ptr
aura pas de copie en profondeur. Ce qui est vrai, parce que ce n'est pas ce qu'il est conçu pour.OriginalL'auteur cdmh
Pas vraiment; c'est du charabia.
Qui de droit.
shared_ptr
est bien conçu, avec copie valide de la sémantique, donc il n'y a pas besoin de traiter avec elle, spécialement lors de la copie d'un objet de classe contenant un.Éventuellement, l'auteur veut dire que si vous voulez copier, plutôt que l'action, l'objet partagé, alors vous aurez besoin d'un constructeur de copie pour en faire une nouvelle. Cependant, il est assez étrange d'être à l'aide d'un
shared_ptr
si vous ne voulez pas le partage de la propriété.OriginalL'auteur Mike Seymour
Je pense que cela signifie que la nouvelle classe va se référer à la vieille de la classe de ressources, où vous pourrait s'attendre à une copie de l'ancienne ressource pour la nouvelle classe, que se passerait-il si c'était un membre à part entière de la classe. Soit est acceptable, ça dépend de ce que vous faites.
Par exemple, si vous copiez un chien, un chien a un os, le chien se faire son propre os, ou faut-il partager l'original de l'os?
Si vous souhaitez que l'objet copié d'avoir une copie de la ressource d'origine et ne pas le partager, vous aurez besoin d'un constructeur de copie lors de l'utilisation de shared_ptr
Je vois. Oui, peut-être que l'auteur est en train de dire que vous aurez besoin d'un constructeur de copie si vous partagez un pointeur lorsque vous ne souhaitez pas au partage de la sémantique. C'est plutôt une chose étrange à faire.
Peut-être que les os sont uniques à chaque chien, mais partagé par d'autres moyens.
OriginalL'auteur Neil Kirk