c++ constructeur de copie partagées par les membres ptr

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 est quand vous avez un objet de référence compté. boost::shared_ptr exemple.

Quelqu'un peut-il donner des détails à ce sujet? 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 faire la bonne chose et augmenter le nombre de référence? Le code suivant, par exemple, copie Inner correctement-pourquoi ça ne marcherait pas 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;}
10
demandé sur Sideshow Bob 2013-07-24 16:04:29

3 réponses

le constructeur de copie par défaut utilisera le constructeur de copie pour chaque variable membre, ou la copie en bits pour les types intégrés.

si vous utilisez un pointeur partagé d'une certaine façon, le constructeur de copie incrémentera le nombre partagé et l'original et les nouveaux objets pointeront vers le même objet.

dans certains cas, c'est ce que vous voulez; copier le pointeur et gérer correctement le compte de référence afin que la ressource puisse être libérée quand elle n'est plus utiliser.

le contexte de l'article cité est dans copier 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 va certainement pas copier en profondeur les sous-objets.

le paragraphe est mal formulé, mais je suis sûr qu'il parle de copie profonde mais dire que shared_ptr pas de copie en profondeur. Ce qui est vrai, parce que ce n'est pas ce qu'il est conçu pour.

14
répondu cdmh 2015-11-06 11:54:46

Quelqu'un peut-il donner des détails à ce sujet?

Pas vraiment, c'est du charabia.

Si nous avons une classe contenant un boost::shared_ptr, ne fera - t-il pas construire la copie quand la classe aura construit la copie-et donc pas le shared_ptr constructeur faire la bonne chose et augmenter le nombre de référence?

C'est exact. shared_ptr est correctement conçu avec une sémantique de copie valide, de sorte qu'il n'est pas nécessaire de traiter avec elle spécialement lors de la copie d'un la classe de l'objet contenant.

É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'utiliser un shared_ptr si vous ne voulez pas de propriété partagée.

6
répondu Mike Seymour 2013-07-24 13:03:24

je pense que cela signifie que la nouvelle classe se référera à la ressource de l'ancienne classe, où vous pourriez vous attendre à ce qu'une copie soit faite de l'ancienne ressource pour la nouvelle classe, comme ce serait le cas si elle é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?

1
répondu Neil Kirk 2013-07-24 12:32:41