-1
votes

Meilleur moyen d'utiliser la variable de membre privé de la classe de base en classe dérivée

J'ai le code suivant, où une classe de base définit une fonction virtuelle pure et la classe dérivée définit cette fonction virtuelle pure pour effectuer certains calculs avec la variable de membre privé de la classe de base var ( var ne sera pas modifié cependant). var est généralement une grande structure.

Dans une perspective de conception, je lisais cela généralement, il est froncé sur le fait de faire var un membre protégé dans ce cas. Le meilleur moyen d'atteindre ce que je veux, c'est simplement passer var comme argument dans virtual_func () ?

Ceci a inspiré une deuxième question. Et si je voulais modifier var dans virtual_func ? Cela changerait-il votre réponse? xxx


1 commentaires

Si vous souhaitez modifier var , alors protégé est votre choix, je ne vois pas pourquoi vous ne voudriez pas l'utiliser. Je veux dire, quand auriez-vous besoin d'utiliser ce mot-clé sinon? Parce que cela ressemble à vous refuser de l'utiliser dans le scénario spécifique qu'il a été conçu pour.


3 Réponses :


1
votes

Si vous ne voulez pas faire var protégé dans la classe de base, vous pouvez ajouter un public ou protégé < / Code> Fonction Getter dans la base que vous pouvez ensuite appeler dans la classe dérivée. Quelque chose comme xxx


4 commentaires

Ah oui, c'est une autre option. Je veux faire var protégé. Cela ferait ma vie vraiment facile, mais j'ai vu des ressources indiquant que c'est une mauvaise pratique. Toute opinion à ce sujet?


@Iamanon Si vous avez besoin de lire et de modifier var dans des classes dérivées mais je ne veux pas que les autres en dehors de la hiérarchie d'héritage y accédent, je dirais que c'est le cas d'utilisation parfait pour un protégé variable membre.


Dans votre réponse, getvar () est une copie de var , qui est apparemment une grande structure selon le QN. Il devrait être renvoyé via const t & habituellement.


@iammilind J'ai dit "quelque chose comme". Que ce soit ou non par ( const ), la référence ou la valeur est logique ici, je laisse jusqu'à OP.



1
votes

"Dans une perspective de design, je lisais cela généralement, il est froncé sur le point de créer un membre protégé dans ce cas."

semble être une mauvaise notion de partout où vendez-vous. Si vous devez accéder à base :: var dans la classe dérivée alors la "décision" forte> meilleure décision de conception est de faire var comme protégé . Tout le reste va déranger l'encapsulation. Quoi d'autre est le cas d'utilisation de protégé autre que l'exigence mentionnée dans votre question. : -)


0 commentaires

2
votes

Bjarne STROSTRUP , dans son livre La conception et l'évolution de C ++ discute de protégé à la section 13.9.

Il a été ajouté précisément pour votre cas d'utilisation: permettre aux classes dérivées d'accéder aux membres de la classe de base, sans exposer ces membres à tout le monde, ni abuser de des déclarations . Cinq ans plus tard, la personne (projet) qui a apporté la demande interdit l'utilisation de variables des membres protégés, car ils sont devenus une source de bogues et de maintenance compliquée. Il conclut en disant que les données protégées n'étaient pas une bonne idée, mais les fonctions des membres protégées sont bien.

À la suite de ces directives, vous devez laisser toutes vos données de la classe de base privé et ajouter fonctions de getter et de réglage protégées pour accéder aux données.

Selon votre cas d'utilisation, et combien les données sont chères de copier, votre getter peut renvoyer une copie des données ou une référence (ou une référence constante). Le retour d'une référence non-Const vous permettrait de modifier les données directement via une affectation ( getvar () = newvar; ) ou pour modifier des membres de données spécifiques de la classe. Renvoyer une référence Const et utiliser une fonction de réglage, encapsulerait les données un peu plus sans exposer trop de la classe. La fonction Setter vous permettrait également de contrôler plus de modifications de var , y compris de toute validation pouvant être requise.


0 commentaires