0

J'ai une classe, appelons-la Produit, dont je souhaite complètement masquer l'implémentation à l'utilisateur. Néanmoins, j'aimerais que l'utilisateur recueille les produits, les fait circuler, généralement, pour décider quoi en faire, sans savoir ce qu'il y a dedans.Masquage de l'implémentation par déclaration directe

La première idée qui m'est venue à l'esprit était simplement de créer une classe ProductFactory et de transmettre la classe Product dans l'en-tête ProductFactory.h.
L'objet de la classe Product serait créé par la méthode makeProduct qui retournerait un pointeur partagé vers la classe Product. L'utilisateur ne pourrait alors pas voir ce qui est à l'intérieur, mais il pourrait par exemple l'envoyer à la classe Service, qui dans sa mise en œuvre inclurait la définition complète du produit afin qu'il puisse accéder à ses entrailles.
Pensez-vous que c'est une bonne idée ou que vous vous sentez plutôt comme une solution de contournement?

Je pensais aussi à utiliser idiom pimpl, dans le cas où j'avais besoin d'une fonctionnalité de haut niveau à laquelle l'utilisateur pouvait accéder, par exemple operator == afin que l'utilisateur puisse vérifier si les produits sont identiques.

Veuillez noter que la classe de base abstraite n'est pas une option, car il n'y a pas vraiment d'interface qui soit à la fois assez limitée pour l'utilisateur et suffisante pour la classe Service par exemple.

+2

Le problème est que le compilateur (et donc tout le monde utilisant la classe) * a besoin * de pouvoir voir toutes les déclarations publiques. Si le compilateur ne peut pas les voir, il ne saura pas quels sont les membres publics, donc vous ne pouvez pas appeler de fonctions publiques dans la classe. Je dirais aller pour l'idiome de pimpl si vous voulez cacher les parties intimes. –

Répondre

2

Si les opérations que shared_ptr vous donne sont suffisantes pour l'utilisateur (par exemple, il devrait y avoir un opérateur ==), alors cette solution devrait être une bonne solution.

Si vous avez besoin de plus que cela, alors pimpl sonne comme un bon moyen, puisque vous pouvez définir les opérations dont l'utilisateur a besoin dans votre classe et définir les opérations dont votre classe Service a besoin dans l'impl. Vous pouvez toujours utiliser des pointeurs intelligents ici pour vous faciliter la vie.

+0

Oui, l'idiome PIMPL combiné avec des pointeurs intelligents devrait être la voie à suivre dans ce cas. Lien: http://herbsutter.com/gotw/_100/ –