4 votes

Renvoi d'objets polymorphes C++ (interfaces)

J'aimerais savoir ce que l'on considère aujourd'hui comme la meilleure pratique lors du retour d'un pointeur vers un objet polymorphe à partir d'une fonction, par exemple lors de l'utilisation de fabriques. Si je transfère la propriété, dois-je retourner boost::unique_ptr<Interface> ? Que dois-je retourner si je ne transfère pas la propriété (par exemple, en retournant une référence à un membre) ? Existe-t-il une autre méthode, non basée sur le boost, qui est aussi couramment utilisée ? Merci.

EDIT : il est censé être compatible avec C++03, avec la possibilité de passer facilement à 0x.

EDIT2 : Veuillez noter que je pose explicitement la question sur commun des approches, des meilleures pratiques, et pas seulement "une façon de faire". Une solution impliquant une recherche et un remplacement conditionnels de la base de code à l'avenir ne ressemble pas à une bonne pratique, n'est-ce pas ?

EDIT3 : Un autre point à propos de auto_ptr est qu'elle est déprécié, quel qu'il soit, il est donc étrange d'annoncer son utilisation au niveau de l'interface. Ensuite, quelqu'un qui n'est pas au courant mettra le pointeur retourné dans un conteneur STL, et ainsi de suite. Donc si vous connaissez une autre solution plus ou moins courante, vous êtes le bienvenu pour ajouter une réponse.

4voto

Omnifarious Points 25666

Utilisez ::std::auto_ptr pour l'instant, et lorsque C++0x sera disponible, vous pourrez alors passer à ::std::unique_ptr . Au moins dans le cas de l'usine où vous rendez la propriété à l'appelant.

Oui ::std::auto_ptr a des problèmes et est laid. Oui, c'est déprécié dans C++0x. Mais c'est la manière recommandée de le faire. Je n'ai pas examiné ::boost::unique_ptr mais sans déplacer la sémantique, je ne vois pas comment il pourrait faire mieux que ::std::auto_ptr .

Je préfère l'idée d'une mise à niveau en effectuant une recherche et un remplacement, bien qu'il existe certains cas inhabituels dans lesquels cela n'aura pas le résultat escompté. Heureusement, ces cas génèrent des erreurs de compilation :

::std::auto_ptr<int> p(new int);
::std::auto_ptr<int> p2 = p; 

devra devenir au moins comme ceci

::std::unique_ptr<int> p(new int);
::std::unique_ptr<int> p2 = ::std::move(p);

Je préfère le système de recherche et de remplacement parce que je trouve que l'utilisation de macros et de typedefs pour ce genre de choses a tendance à rendre les choses plus obscures et difficiles à comprendre par la suite. Une recherche et un remplacement de votre base de code peuvent être appliqués sélectivement si nécessaire ( ::std::auto_ptr ne disparaîtra pas dans C++0x, elle est simplement dépréciée) et laisse votre code avec une intention claire et évidente.

Quant à ce qui est "communément" fait, je ne pense pas que le problème existe depuis assez longtemps pour qu'il y ait une méthode communément acceptée pour gérer le changement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X