Maison > développement back-end > C++ > le corps du texte

Pourquoi mon membre statique dans une classe de modèle ne s'initialise-t-il pas lorsqu'il est utilisé ?

Patricia Arquette
Libérer: 2024-11-01 09:33:30
original
257 Les gens l'ont consulté

 Why Does My Static Member in a Template Class Not Initialize When Used?

Initialisation des membres statiques dans les classes de modèles

Lors de l'initialisation des membres statiques d'une classe de modèles, il est essentiel de comprendre comment l'instanciation du modèle affecte la définition des membres.

Dans le code fourni, l'initialisation du membre statique est enveloppée dans une structure d'assistance imbriquée pour éviter les problèmes avec les classes non basées sur un modèle.

Cependant, lorsque la classe englobante est paramétrée par un modèle, le La structure d'initialisation imbriquée ne peut pas être instanciée à moins que l'objet d'assistance ne soit accessible dans le code principal.

Comprendre l'instanciation implicite de modèle

Le comportement de l'initialisation des membres statiques dans les modèles est régi par la norme ISO/IEC C 2003 (14.7.1). Selon cette norme :

  • Sauf explicitement instancié ou spécialisé, le membre d'un modèle de classe est implicitement instancié lorsqu'il est référencé dans un contexte nécessitant sa définition.
  • L'initialisation d'une donnée statique Le membre ne se produit que si le membre de données lui-même est utilisé d'une manière qui nécessite son existence.

Analyse du code

  • [1] a commenté et [2] a commenté : Puisqu'il n'y a aucune référence aux données membres statiques, leurs définitions (y compris les déclarations et les instanciations) ne sont pas créées, ce qui n'entraîne aucun effet secondaire.
  • [1] non commenté : B::getB() fait référence à B::mB, nécessitant son existence. Cependant, B::mInit n'est pas utilisé, ce qui conduit à sa non-instanciation. Le constructeur de B::InitHelper n'est pas exécuté, ce qui fait que B::mB n'est pas attribué.
  • [1] et [2] non commenté : cela a fonctionné dans votre cas en raison d'un comportement non spécifié concernant l'ordre d'initialisation.
  • [1] commenté et [2] non commenté : B::getHelper(). Cependant, puisque B::mInit n'est pas construit en premier, son constructeur tente de l'attribuer à un objet chaîne non encore construit, ce qui entraîne une erreur de segmentation.

Conclusion et élégante Solution

Le comportement standard implique que les données membres statiques ne sont pas automatiquement initialisées à moins qu'elles ne soient utilisées. Pour éviter ce problème, envisagez d'utiliser une spécialisation explicite pour définir explicitement les données membres statiques avant de les référencer. Cela impose une initialisation ordonnée, car les spécialisations explicites sont traitées comme des déclarations régulières.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!