Supposons que j'ai une classe comme celle-ci (simplifiée): Cette classe fait partie d'une API.
Le FOO_P est toutes les parties privées de la classe, qui ne sont pas
déclaré dans la classe Foo elle-même comme d'habitude, mais plutôt dans une classe distincte déclarée qui n'est utilisée que par la mise en œuvre sous-jacente non visible à l'extérieur. P> J'ai vu ce modèle utilisé dans un couple de Projets, y a-t-il un nom pour cela? P> Aussi, comment puis-je l'utiliser correctement (par exemple, la sécurité des exceptions, etc.)? Où devrait-on aller la mise en œuvre réelle? En classe FOO, comme d'habitude, utilisez uniquement FOO_P pour le stockage de données ou dans la classe FOO_P avec FOO étant juste une enveloppe? P> P>
3 Réponses :
Ceci est connu est PIMPL. mise en œuvre privée / pointue à privé. La classe, Je l'ai trouvé difficile dans VC ++ - il casse la fin du code. Il est utile que si vous êtes très sûr de votre implémentation et que vous ne voulez pas que les membres code> privé code> et i Mettez la mise en œuvre effective de la classe foo_p code>, votre classe serait mise en œuvre de manière privée et accessible via un pointeur de manière à ce que, plutôt que d'afficher la véritable classe aux clients, ils ne peuvent voir que L'interface publique que vous avez choisie d'exposer. Il est essentiellement abstrait de l'en-tête des vestiges des détails de mise en œuvre présents dans le protégé code> et membres privés code>. P>
sont protégés code> à l'écran dans l'en-tête. P>
foo_p code> dans le fichier CPP pour la classe foo code>, bien que cela ait pu être la cause de la rupture de la fin du code, au moins i ne pas avoir à courir le risque de la classe étant réutilisé par l'inclusion de son en-tête. P>
Les en-têtes et les niveaux de protection normaux (public / privé) ne cachent-ils pas essentiellement la mise en œuvre »?
@Matthew: Malheureusement, non. Vous devez inclure des en-têtes de mise en œuvre, qui peuvent souvent être inconfortables lorsqu'ils dépendent par exemple les en-têtes de fenêtres, qui sont méprisables.
@Matthewflaschen: Oui, mais seulement dans le sens où vous ne pouvez pas y accéder, mais vous pouvez toujours voir i> it, lorsque vous regardez le code.
Droite, la citation Wikipedia Pubby a donné m'a aidé à l'obtenir, en particulier le point sur la compatibilité binaire.
AFAIK, Les membres code> protégés ne sont pas déplacés de foo code> à foo_p code>, car ils sont également des parties de l'API. Seuls Les membres privés code> ne font pas partie de l'API, ils sont donc cachés des yeux de l'utilisateur.
C'est un point D-pointeur qui est un type de pointeur opaque. Semblable à l'idiome pimpl. P>
Un type de pointeur opaque couramment utilisé dans les déclarations de classe C ++ est le d-pointeur. Le D-Pointer est le seul membre de données privé de la classe et pointe vers une instance d'une structure. Nommé par Arnt Gulbrandsen de Trolltech, cette méthode permet aux déclarations de classe d'omettre privé Membres de données, à l'exception du D-pointeur lui-même. [6] Le résultat est que plus de la mise en œuvre de la classe est cachée de la vue, qui ajoute de nouveaux Les membres des données à la structure privée n'affectent pas le binaire Compatibilité et que le fichier d'en-tête contenant la classe Déclaration seulement doit #include ces autres fichiers nécessaires à l'interface de classe plutôt que pour sa mise en œuvre. Comme un côté avantage, les compiles sont plus rapides car le fichier d'en-tête change de moins souvent. Le d-pointeur est fortement utilisé dans les bibliothèques QT et KDE. P> blockQuote>
c'est l'idiome pimpl p>
voir p>
@PMB Merci pour l'indice. Correction des trois liens. o.o permaliens ... quand ils ont travaillé, ils étaient si gentils i> :(