7
votes

C ++ comprend dans un cycle

Veuillez considérer les trois fichiers simplifiés suivants:
étudiant.h: xxx

cours.h: xxx

et main.cpp: xxx


Cela ne compilerait pas me donner
Erreur C2146: Erreur de syntaxe: manquant ';'; Avant l'identifiant 'Somrestudent'

Il produirait beaucoup plus d'erreurs (même pour les bonnes portions du code) dans un programme plus compliqué. Je suppose que le design est faux: étudiant inclut cours et cours inclut étudiant . Ce que je veux représenter, c'est qu'un étudiant prend plusieurs cours et un cours a plusieurs élèves (j'utilise des vecteurs dans un programme complet, les évitées ici pour la simplicité). Tout conseil en quoi cela serait possible?

Merci d'avance, Vlad.

Mise à jour: Merci pour des réponses rapides. Déclaration en avant de Étudiant Classe dans Course de cours Classe (et supprimer #include "Student.h" ) semble faire le travail. Désolé, je pensais que cela n'aurait pas d'importance ici, mais j'utilise en fait des vecteurs des indicateurs de const dans chacun d'eux (puisqu'un étudiant ne devrait pas être en mesure de contrôler un parcours et un et un Cours ne devrait pas être capable de contrôler un «code> étudiant ), comme suit: xxx


1 commentaires

4 Réponses :


0
votes

Vous ne pouvez pas faire cela, vous devez convertir le moins l'un d'entre eux en un pointeur.


0 commentaires

19
votes

Cela se passe circulaire, tant que vous déclarez SOMECourse et Somrestudent en tant que membre non-pointeur de classe étudiant et cours respectivement (comme vous l'avez fait), car le compilateur voit la définition de étudiant , il doit connaître sa taille qui signifie à son tour, il doit connaître la taille de ses membres , y compris cours qui est l'un d'entre eux. Mais pour connaître la taille du cours , il doit connaître la taille de étudiant . Cela devient circulaire.

Vous devez donc casser ce cercle, en déclarant au moins un d'entre eux comme pointeur . Par exemple, vous pouvez le faire: xxx

Notez également que lorsque vous déclarez psomécours comme pointeur de type cours * , vous n'avez pas besoin d'inclure le fichier d'en-tête dans lequel cours est défini. Juste avant la déclaration de la classe le cours suffit, comme je l'ai fait dans le code ci-dessus.

La raison pour laquelle cela fonctionne parce que la taille du pointeur de Toute classe est la même et le compilateur n'a pas besoin de connaître la taille de la classe, afin de connaître la taille du pointeur de la même classe. En d'autres termes, la compilée peut savoir tailleof (cours *) sans même savoir Tailleof (cours) .


0 commentaires

1
votes

Si vous souhaitez relier deux classes, vous devrez utiliser la déclaration avant et un pointeur à une instance du type déclaré dans l'une des interfaces de classe. Une autre interface peut rester la même que tant qu'il comprend la déclaration de l'interface de type de variable de membre.

cours.h: xxx

étudiant.h: < Pré> xxx


0 commentaires

4
votes

En plus de Nawaz Réponse:

Si vous souhaitez accéder aux membres bien sûr des membres de l'étudiant, vous devez inclure le cours.h dans le fichier .CPP - dossier où vous définissez les méthodes d'étudiant.

avec g ++ Vous obtiendrez une erreur comme "Utilisation non valide du type incomplet" sinon.


0 commentaires