11
votes

Quel est ce modèle de conception? Comment l'utiliser?

Supposons que j'ai une classe comme celle-ci (simplifiée): xxx

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.

J'ai vu ce modèle utilisé dans un couple de Projets, y a-t-il un nom pour cela?

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?


0 commentaires

3 Réponses :


8
votes

Ceci est connu est PIMPL. mise en œuvre privée / pointue à privé. La classe, foo_p , 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é et membres privés .

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 privé et sont protégés à l'écran dans l'en-tête.

i Mettez la mise en œuvre effective de la classe foo_p dans le fichier CPP pour la classe foo , 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.


5 commentaires

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 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 protégés ne sont pas déplacés de foo à foo_p , car ils sont également des parties de l'API. Seuls Les membres privés ne font pas partie de l'API, ils sont donc cachés des yeux de l'utilisateur.



2
votes

C'est un point D-pointeur qui est un type de pointeur opaque. Semblable à l'idiome pimpl.

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.

https://fr.wikipedia.org/wiki/opaque_pointer#c. 2B.2B


0 commentaires