Retour d'un std::unique_ptr
à partir d'une méthode de fabrique est très bien et devrait être une pratique recommandée. Le message qu'elle véhicule est (OMI): Vous êtes désormais le seul propriétaire de cet objet. De plus, pour votre confort, l'objet ne sait comment détruire lui-même.
Je pense que c'est beaucoup mieux que de retourner un pointeur brut (où le client a rappeler comment et si pour se débarrasser de ce pointeur).
Cependant, je ne comprends pas votre commentaire à propos de libérer le pointeur de prolonger sa durée de vie. En général, j'ai rarement vu aucune raison d'appeler à l' release
sur un smartpointer, car je pense que les pointeurs devraient toujours être gérés par une sorte de RAII de la structure (à peu près la seule situation où je m'appelle release
est de mettre le pointeur dans une autre gestion de discbased, par exemple, un unique_ptr
avec un autre deleter, après j'ai fait quelque chose pour justifier de nettoyage supplémentaires) .
Par conséquent, le client peut (et doit), il suffit de stocker l' unique_ptr
quelque part (comme un autre unique_ptr
, qui a été déplacer construit à partir de l'retourné une) tant qu'ils ont besoin de l'objet (ou d' shared_ptr
, s'ils ont besoin de plusieurs copies du pointeur). Si le client le code devrait ressembler à ceci:
std::unique_ptr<FooBar> myFoo = Foobar::factory(data);
//or:
std::shared_ptr<FooBar> myFoo = Foobar::factory(data);
Personnellement, je voudrais également ajouter un typedef
pour le retour de type pointeur (dans ce cas - std::unique_ptr<Foobar>
) et ou la deleter (dans ce cas, std::default_deleter) à votre usine de l'objet. Cela rend plus facile si vous décidez plus tard de modifier la répartition de votre pointeur(et donc besoin d'une méthode différente pour la destruction du pointeur, qui sera visible en tant que second paramètre de modèle de std::unique_ptr
).
Donc, je voudrais faire quelque chose comme ceci:
class Foobar {
public:
typedef std::default_deleter<Foobar> deleter;
typedef std::unique_ptr<Foobar, deleter> unique_ptr;
static unique_ptr factory(DataObject data);
}
Foobar::unique_ptr myFoo = Foobar::factory(data);
//or:
std::shared_ptr<Foobar> myFoo = Foobar::factory(data);