c++ fichiers d'en-tête, y compris mutuellement
J'ai deux classes à la fois de séparer les fichiers d'en-tête. Chaque fichier a un champ qui est le type de l'autre classe. Maintenant, j'ai inclus dans l'en-tête de chaque fichier de l'en-tête d'un autre fichier, mais le compilateur génère des erreurs. Ce qui me manque?
- Quelle sorte de "champ"?
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas avoir chaque classe ont "un champ qui est le type de classe", qui serait une définition récursive et non seulement le compilateur ne sera pas en mesure de faire tout le sens, il n'a même pas de sens logique.
Chaque classe a un champ qui est le type de l'autre classe est le genre de l'impossibilité que l'on ne voit dans M. C. Escher des dessins ou des animations de celle-ci, comme celui-ci:
B. de Smit et H. W. Lenstra - Source: escherdroste.math.leidenuniv.nl
basé sur Escher "Imprimer Galerie" Lithographie, 1956, voir Wikipedia
L'un des deux champs devront être pointeur, de manière à briser les récursive de confinement, et d'éviter la logique de l'impossibilité.
Qui nous amène au problème suivant: si la classe B est de contenir une instance de la classe A, alors, évidemment, doit être déclarée avant la classe B, de sorte que l'Un est déjà connu du compilateur lors de la compilation de B. Mais si la classe A est déclarée avant la classe B, comment peut-on déclarer un pointeur vers un point B en Un? La classe B n'est pas encore connu au moment de l'est compilé! La réponse à cette question est un spécial construire connu comme avant la déclaration de qui existe précisément pour tenir compte des situations de ce genre. Avant la déclaration de la classe B ressemble à ceci:
Tout, c'est de dire au compilateur qu'il y aura une classe appelée B. Il n'a pas d'indiquer au compilateur rien sur le contenu de la classe B, il y a très peu de choses que nous pouvons faire avec elle, mais nous pouvons faire une chose: déclarer des pointeurs vers B.
Donc, la solution complète pour le problème ressemble à ceci:
fichier "A. h":
fichier "B. h":
Vous ne devriez pas inclure les fichiers d'en-tête à l'intérieur de l'autre, il suffit d'inclure les fichiers d'en-tête dans vos fichiers source.
Dans les en-têtes, vous pouvez utiliser une déclaration anticipée:
Vous pouvez également protéger contre un fichier à inclure deux fois en utilisant le préprocesseur:
Je sais que c'est un vieux sujet, mais peut-être que vous êtes toujours intéressé à la solution!
Fait en C++, vous pouvez utiliser deux classes de façon récursive sans l'aide de pointeurs et voici comment le faire.
de fichiers: un.h
fichier: b.h
fichier: main.cpp
et c'est tout!
bien sûr, c'est juste par curiosité 🙂
"B<A>::a" uses an undefined class "A"
Vous voudrez probablement utiliser avant la déclaration, sauf si vous voulez vraiment mettre instance de chaque classe dans chaque autres. Dans ce cas, vous ne devriez pas utiliser quoi que ce soit.
Si B ne peut exister que dans Une, il me semble être capable de créer de A et B sans l'aide d'un pointeur. B a simplement déclarer avant Un et de ne pas l'inclure (en évitant le récursive de l'inclusion).
Dans mon cas, un
Document
a unSection
qui obtient une référence à sonDocument
.section.h
document.h
main.cpp
Ce code compile avec
g++
et fonctionne sur Linux.Un (complexe) de l'ensemble des
ifdef
peut l'activer pour les autres cas, mais je ne suis pas sûr à propos de la lisibilité...Outre la possibilité de déclaration - si il semble que vous avez besoin de deux classes mutuellement dans l'autre, il est de mon expérience, un signe pour une erreur dans la profondeur de l'héritage.
Feather, les classes sont une sorte de frères et sœurs et vous devez créer une classe mère pour les deux.
Ou vous essayez d'utiliser une classe qui est en fait un parent de la classe dans un qui devrait avoir un frère ou une sœur de cette classe parent. Ensuite, vous devez créer ce frère comme une classe de troisième.