2010-08-14 21 views
2

Supposons que j'ai une classe Boda:Quelle est la bonne façon de mettre un pointeur intelligent dans les données de classe (en tant que membre de classe) en C++?

class Boda { 
    ... 
}; 

Et j'ai un membre cydo dans cette classe que je veux être un pointeur intelligent (qui est, je veux qu'il se désallouée automatiquement dès que la classe obtient détruit).

J'utilise des pointeurs intelligents de Boost, donc j'écrire:

class Boda { 
    boost::shared_ptr<int> cydo; 
    public: 
     Boda() { 
      cydo = boost::shared_ptr<int>(new int(5)); 
     } 
}; 

Est-ce l'utilisation correcte de mettre des pointeurs intelligents en tant que membres de la classe?

Merci, Boda Cydo.

+1

Juste pour que vous sachiez, un chemin plus court de votre code est: 'cydo.reset (new int (5));'. Mais préférez la liste d'initialisation de toute façon. – GManNickG

Répondre

10
class Boda { 
    boost::shared_ptr<int> cydo; 
    public: 
     Boda() : cydo(new int(5)) {} 
}; 

Bien, je ne peux pas penser pourquoi vous voulez envelopper un int ... :)

+0

Oups, ce n'était qu'un exemple. J'ai vraiment quelque chose de mieux là-bas. :) – bodacydo

+4

Essayez de toujours 1) utiliser les listes d'initialisation et 2) utiliser l'initialisation directe plutôt que l'initialisation de la copie. Évitez les affectations et les copies redondantes. Voir Sutter: http://www.gotw.ca/gotw/036.htm – dirkgently

2

La vraie question que vous devriez vous demander si vous avez besoin d'affecter le membre séparément de la classe. Il est généralement préférable de stocker le membre dans la classe plutôt que de stocker n'importe quel type de pointeur. Si vous ne pouvez pas le faire, si par exemple la durée de vie du membre commence avant ou après que le conteneur est créé, peut être étendu au-delà de la propriété du membre peut être céder à d'autres objets, vous devez utiliser des pointeurs. Une fois que vous avez besoin d'utiliser des pointeurs, vous devez préférer les pointeurs intelligents aux pointeurs bruts et sélectionner le type particulier en fonction de vos besoins. Si la propriété du membre ne doit pas être partagée avec d'autres objets, mais que vous devez utiliser un pointeur car la durée de vie de l'objet contenu peut commencer avant ou après celle du conteneur ou si la propriété peut être transférée à d'autres objets la ressource (sauf si cédée) est la seule responsabilité du conteneur, alors préférez unique_ptr ou auto_ptr.

Si l'objet contenu n'appartient pas uniquement à cette classe, utilisez un shared_ptr. Cela peut également être utilisé si le membre est utilisé par différents threads, chaque thread conservant son propre shared_ptr même si la propriété est détenue dans un seul thread, pour éviter de détruire l'objet dans un thread quand il est encore utilisé dans un autre thread .