2015-09-24 1 views
11

J'ai une classe foo, avec un membre bar de type std::shared_ptr<int>:Affectation à une variable membre std :: shared_ptr

class foo 
{ 
    std::shared_ptr<int> bar; 
    /*other stuff here*/ 
}; 

Dans cette classe, je veux attribuer un new int-bar. Mais je ne peux pas écrire bar = new int(); car le pointeur n'a pas d'opérateur d'assignation publique.

Comment devrait Je le fais? Je pourrais std::move ou std::swap mais aucun de ceux semble juste.

Répondre

10

Vous pouvez utiliser reset pour cela:

bar.reset(new int()); 

Cela delete le contenu actuel (le cas échéant) et le pointeur interne à celui retourné par l'expression new.

13

bar = std::make_shared<int>(); est un moyen, surtout si vous souhaitez conserver la traçabilité d'un opérateur d'affectation.

+0

J'ai vu votre montage. Est-ce que ce changement initialise toujours le 'int' à 0? 'new new()' would, 'new new' ne le ferait pas. – Bathsheba

+2

'std :: make_shared (new int())' n'est pas valide; 'make_shared' transmet parfaitement les arguments au constructeur' T'. Il est spécifié de construire l'objet en utilisant ':: new (pv) T (std :: forward (args) ...)' donc s'il n'y a pas d'argument, il sera initialisé en valeur. – TartanLlama

+1

@Bathsheba: C'est vrai, il n'y a pas de formes "non initialisées" de l'une des fonctions 'make_ *'. Je pense que quelque chose comme ça a été proposé une fois (dans le cadre d'une proposition pour autoriser les types de tableaux dimensionnés pour make_ {shared, unique}), et la proposition a été faite avec un formulaire non initialisé make_initialisation. En général, la bibliothèque standard rend très difficile la production de valeurs non initialisées, même si c'est parfois ce dont vous avez besoin ... –