Maison >développement back-end >C++ >Comment puis-je éviter l'invisibilité des membres et la surcharge du code source dans les modèles de classe hérités ?

Comment puis-je éviter l'invisibilité des membres et la surcharge du code source dans les modèles de classe hérités ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-01 05:38:27179parcourir

How Can I Avoid Member Invisibility and Source Code Bloat in Inherited Class Templates?

Éviter l'invisibilité des membres et la surcharge du code source avec les modèles de classe hérités

Le problème rencontré se produit lorsqu'un modèle de classe, CDerived, hérite d'une base le modèle de classe, CBase et tous les membres publics de CBase deviennent invisibles pour CDerived lorsque le code est compilé avec la conformité standard C activée.

Solutions au problème :

Solution n°1 : Qualification explicite

Références de préfixe aux membres CBase dans CDerived avec CBase::, par exemple, Fn1() devient CBase::Fn1(). Cela force la recherche de nom à se produire dans la portée de la classe de base, rendant les membres visibles. Cependant, cette solution nécessite de nombreux ajouts verbeux au code, ce qui entraîne une surcharge du code source.

Solution n°2 : this-> Prefix

Références de préfixe aux membres CBase avec this->, par exemple, Fn1() devient this->Fn1(). Cela rend également les membres visibles, mais nécessite encore une fois des modifications détaillées du code.

Solution n°3 : Utiliser des instructions

Ajouter des instructions using dans CDerived pour importer des membres CBase, par exemple, en utilisant CBase::Fn1; en utilisant CBase::Fn2;. Cela ne nécessite qu'une seule instruction using par membre utilisé dans CDerived, mais il n'existe pas d'instruction générale pour importer tous les membres.

Solution n°4 : mode permissif non standard

Désactivez la conformité C stricte dans les paramètres du compilateur pour supprimer le problème de recherche de nom. Il s’agit cependant d’une solution globale qui s’éloigne du standard et n’est pas portable.

Une Solution Plus Concise #5 :

Pour réduire la verbosité de la Solution # 3, les macros peuvent être utilisées pour générer les instructions using nécessaires.

Mise en œuvre :

Incluez la bibliothèque de préprocesseur Boost et définissez une macro, USING_ONE, pour générer une seule using instruction pour un membre de base spécifique.

Définissez une autre macro, USING_ALL, pour générer une séquence d'instructions using pour tous les membres de base spécifiés.

Dans le modèle de classe de base, définissez une macro, USING_CBASE, pour générer les instructions using pour tous les membres protégés et publics qui seront utilisés dans les modèles de classe dérivée.

Dans le modèle de classe dérivée, utilisez la macro USING_CBASE appropriée pour importer les membres nécessaires à l'aide des macros définies précédemment. Ce processus nécessite un minimum de recherche et de saisie, réduisant ainsi la surcharge du code source tout en conservant la portabilité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn