La récursion empêche la définition de classe
Une requête de programmation récente a abordé le problème de la déclaration d'un membre privé dans une classe qui reflète le propre type de la classe. Plus précisément, le code suivant génère une erreur de « type incomplet » :
class A { private: A member; }
Cependant, l'utilisation d'un pointeur au lieu d'une déclaration de membre directe ("A* member;") résout le problème. Pourquoi est-ce le cas ?
La réponse réside dans le processus de définition de classe. Lorsque le membre est déclaré dans la définition de classe, la classe elle-même est toujours en cours de définition. Cela laisse le type « A » indéfini, ce qui en fait un « type incomplet ». En revanche, lors de l'utilisation d'un pointeur, le compilateur peut reconnaître « A » comme nom de classe avant même que sa définition ne soit complète, ce qui lui permet de définir le type « pointeur vers A ».
Ce concept s'étend au-delà des classes. Déclarer un type comme "Foo;" signale effectivement une déclaration de classe sans sa définition complète. Cependant, "Foo* foo;" peut être défini, car il représente un pointeur vers un type "Foo", que le compilateur reconnaît à ce stade.
La même logique s'applique lors de l'utilisation d'une définition de type récursive qui fait référence à elle-même. Cependant, y parvenir en utilisant uniquement des pointeurs offre une approche plus simple. Envisagez l'alternative suivante :
class A { private: boost::shared_ptr<A> member; };
En employant des pointeurs intelligents (par exemple, boost::shared_ptr), le besoin de gestion manuelle de la mémoire est éliminé.
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!