Quel est votre convention pour typedef avec shared_ptr?
Je suis volte-face entre les conventions de nommage pour les typedef avec le boost::shared_ptr modèle. Par exemple:
typedef boost::shared_ptr<Foo> FooPtr;
Avant de s'installer sur une convention, j'aimerais voir ce que les autres utilisent. Qu'est-ce que votre convention?
EDIT:
À ceux de nidification de la définition de type à l'intérieur de Foo, n'est-ce pas vous déranger que Foo est maintenant conscient de la façon dont il sera passé autour? Il semble casser l'encapsulation. Comment à ce sujet:
class Foo
{
public:
typedef std::vector<Foo> Vector
};
Vous ne feriez pas cela maintenant, voulez-vous? 🙂
- Pour ajouter à cette question, comment gérer les en-tête de l'inclusion lorsque vous déclarez une telle typedef? N'est-ce pas le vent jusqu'causant chacun d'avoir à inclure des Foo.h (plutôt que de simplement dire "la classe Foo;"), ce qui conduit à ralentir construit et, éventuellement, des dépendances circulaires?
- Je ne pense pas que le imbriquée typedef pauses encapsulation si vous utilisez une usine. En fait, je dirais que dans ce cas, il améliore l'encapsulation dans le cas où le pointeur de changement de type.
#include "foo_ptr.hpp"
😉- J'ai appeler une macro
MYLIB_DECLARE_PTRS(Foo);
pour remplacerclass Foo;
. Inspiré par le convention utilisée dans de Pixar USD --- j'ai aimé cette convention.
Vous devez vous connecter pour publier un commentaire.
J'aimerais aussi ajouter quelques options à cette vieille question, même s'ils peuvent être très controversée...
Similaire à OldPeculier réponse j'aime le type court de noms qui ressemblent à la norme pointeurs aussi étroitement que possible.
Dans un projet utilisé
shared_pointer
presque partout, j'ai utiliséJ'ai profité de trois choses:
Foo* myFoo1;
surFoo *myFoo1;
pour plusieurs raisons, et il correspond bien avecFoo_ myFoo2
.En cas de besoin de typedefs pour les différents types de pointeurs intelligents, j'irais pour
Avec l'augmentation de la prise en charge d'Unicode dans les normes et le compilateur implémentations, je serais tenté d'essayer la syntaxe suivante, en supposant que ces caractères étoiles serait considéré comme une partie régulière de l'identificateur de type. Bien sûr, ce n'est pratique que si toutes les parties impliquées, les développeurs ont pratique d'une méthode de saisie de texte pour cette:
(Un test rapide a indiqué que ce n'est pas réellement le travail, au moins avec mon environnement de construction. Mais la même chose est vraie pour
Foo_ä
.)Réponse: ne pas le faire. Il est commode pour vous et personne d'autre. Dire ce que tu veux dire.
Ma préférence:
Le problème avec juste
FooPtr
est que vous pouvez avoir différents types de pointeurs (par exemple,weak_ptr
s). Je n'ai pas beaucoup de soins pour les abréviations, mais c'est tout à fait autre chose.Foo::SharedPointer
dans un fichier d'en-tête, sans y comprisFoo.h
?Personnellement, dans le code, je suis responsable, vous devez généralement voir un FooPtr typedef serais dans le même espace de noms portée de Foo et Foo contiendrait un génériquement appelé 'SmartPtr' typedef pour le même type que FooPtr. Ayant FooPtr permet de faire facilement un non-verbose manuel d'utilisation. avoir la imbriquée définition de type pour 'SmartPtr" ou équivalant facile d'utilisation générale dans les modèles, macros, etc. sans avoir à connaître que le type réel de l'pointeur intelligent.
Aussi, je suggère l'ajout d'un "subjectif" de la balise à cette question.
J'ai utilisé à la fois l'extérieur et encapsulé typedef, mais a terminé avec la première,
uniquement parce que dans le combiné d'expressions, cela paraît plus propre que
Foo::Ptr
.Assez souvent, ces classes sont réalisable grâce à une méthode de fabrique seulement:
Qui est une sorte de "plus fort" que l'encapsulation de la définition de type, encore un schéma très commun.
Je ne suis pas un grand fan des hongrois, des conventions de nommage, j'ai l'habitude d'utiliser:
Suffisamment détaillés pour être clair, mais assez court pour ne pas être un énorme problème. En tout cas, je n'hésiterais pas à indiquer qu'il est précisément un pointeur partagé, surtout si vous n'êtes pas le seul qui va être à l'aide de ce type à l'avenir.
Je suis généralement pas un fan de très courte identifiants, mais c'est un cas où je vais les utiliser.
Cela permet shared_ptr pour ressembler à l'ordinaire pointeurs d'aussi près que possible sans risque de confusion.
Et comme pour briser l'encapsulation—non, typedefing le shared_ptr type au sein de la classe de ne pas briser l'encapsulation, pas plus que typedefing à l'extérieur de la classe. Quelle est la signification de "l'encapsulation" serait-il violent? Vous n'êtes pas rien révéler sur la mise en œuvre de Foo. Vous êtes simplement à la définition d'un type. Ce qui est parfaitement analogue à la relation entre les Foo* et Foo. Foo* est un certain type de pointeur de Foo (la valeur par défaut, car il arrive). Foo::p est un autre type de pointeur à Toto. Vous n'êtes pas briser l'encapsulation, vous êtes juste en ajoutant le type de système.
J'ai l'habitude de résumer la la
typedef
à l'intérieur de la classe. La raison en est que nous avons de la mémoire sensible de code, et il est facile de basculer entre lesboost::shared_ptr
etboost::intrusive_ptr
Depuis
intrusive_ptr
est quelque chose que les besoins de la classe à l'appui, il fait sens pour moi d'avoir la connaissance de ce qui pointeur partagé à utiliser être enveloppé dans la classe.Mon premier réflexe est de demander, "Pourquoi typedef qui?"
En réponse à votre edit: en Fait c'est plutôt une approche intéressante qui pourrait être utile dans de nombreuses situations. L'aide afin de revenir à votre première question que vous pourriez avoir:
C'est agréable quand elle se termine avec
_t
._t
sont reserved pour la mise en œuvre.C'est l'une des conventions, j'ai été volte-face pour:
...de voir que
boost::shared_ptr
est une application de la Proxy modèle.typedef boost::shared_ptr<MyClass> MyClass$;
Comment sur:
Permettant ensuite tout
Shared
classe à avoir leur propre Ptr objet, comme dans:Je serait de se débarrasser de l'espace de noms plutôt que de raccourcir le type.
Qui a le bonus que vous pouvez changer entre les implémentations facilement.
Si c'est encore trop long (je pense que c'est juste à droite):