113 votes

Quelles sont les utilisations pratiques d'un constructeur protégé ?

Pourquoi déclarer un constructeur protégé ? Je sais que les constructeurs sont déclarés privés dans le but de ne pas permettre leur création sur la pile.

137voto

Henk Holterman Points 153608

Lorsqu'une classe est (prévue comme) une classe abstraite, un constructeur protégé est tout à fait approprié. Dans cette situation, vous ne voulez pas que les objets soient instanciés à partir de la classe, mais seulement l'utiliser pour en hériter.

Il existe d'autres cas d'utilisation, comme lorsqu'un certain ensemble de paramètres de construction doit être limité aux classes dérivées.

9 votes

+1 Mais la ne doit pas nécessairement être une classe abstraite. C'est souvent le cas cependant.

4 votes

N'est-il pas suffisant de déclarer qu'une fonction est purement virtuelle pour définir une classe de base ? Ou encore en l'absence de fonction virtuelle pure. Quel est l'événement de création d'une classe dérivée d'une telle classe abstraite ?

0 votes

@Henk Holterman C'est certainement le cas - voir la section 10.4 de la norme C++, intitulée "Classes abstraites".

15voto

Nick Lewis Points 3143

Les constructeurs non publics sont utiles lorsqu'il existe des exigences de construction qui ne peuvent être garanties uniquement par le constructeur. Par exemple, si une méthode d'initialisation doit être appelée juste après le constructeur, ou si l'objet doit s'enregistrer auprès d'un objet conteneur/gestionnaire, cela doit être fait en dehors du constructeur. En limitant l'accès au constructeur et en ne fournissant qu'une méthode de fabrique, vous pouvez vous assurer que toute instance reçue par un utilisateur remplira toutes ses garanties. Cette méthode est aussi couramment utilisée pour mettre en œuvre un Singleton, qui n'est en fait qu'une autre garantie de la classe (qu'il n'y aura qu'une seule instance).

La raison de rendre le constructeur protégé, plutôt que privé, est la même que pour rendre toute autre méthode ou champ protégé plutôt que privé : afin qu'il puisse être hérité par les enfants. Peut-être voulez-vous une méthode de fabrique publique et non virtuelle dans la classe de base, qui renvoie des références aux instances des classes dérivées ; les classes dérivées veulent évidemment avoir accès aux constructeurs parents, mais vous ne voulez toujours pas les créer en dehors de votre fabrique.

12voto

Guidobot Points 21

Un constructeur protégé peut être utilisé pour rendre une classe effectivement abstraite lorsqu'aucune de ses méthodes n'est purement virtuelle.

Elle n'est pas tout à fait abstraite au sens du C++ puisque les classes amies peuvent toujours l'utiliser sans la surcharger, mais il faudrait alors les déclarer.

9voto

Un constructeur protégé signifie que seuls les membres dérivés peuvent construire des instances de la classe (et des instances dérivées) en utilisant ce constructeur. Cela peut sembler un peu "chicken-and-egg", mais c'est parfois utile lors de l'implémentation de fabriques de classes.

4 votes

Techniquement, cela ne s'applique que si TOUS les ctors sont protégés.

2 votes

Les classes amies peuvent également appeler le constructeur protégé (pas seulement les classes dérivées).

0 votes

...et une utilisation d'une classe amie appelant le constructeur protégé serait dans le cas d'un objet qui a des membres qui sont constants (définis par le constructeur) mais qui doivent être publics, mais qui ne doivent jamais être définis par un autre accès public, ce qui garantit que l'objet ne sera pas créé ailleurs et que les données ne seront donc pas modifiées ailleurs non plus.

8voto

Umair Ahmed Points 4020

Une utilisation pourrait être les modèles d'usine

8 votes

Nous vous serions reconnaissants d'étoffer votre réponse en y ajoutant des exemples concrets.

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