Boucle infinie en C
darkman
-
chmanu Messages postés 166 Date d'inscription Statut Membre Dernière intervention -
chmanu Messages postés 166 Date d'inscription Statut Membre Dernière intervention -
salut tout l'monde !!
j'ai super besoin d'aide !!
j'utilise Visual C++, et je sais pas comment eviter les erreurs du type "#include nesting level is 361 deep; possible infinite recursion"
en fait j'ai plusieurs classes, entre autres j'ai une classe Jeu et une classe Joueur, je veux avoir un attribut de type Jeu dans la classe Joueur et un attribut de type Joueur dans la classe Jeu, je suis donc obligé de mettre #include "Joueur.h" dans Jeu.h et #include "Jeu.h" dans Joueur.h.
mais là ca lui plait pas paskil rentre dans une boucle infinie a la compilation, je comprend pourquoi mais je ne sais pas comment eviter ça :(
Merci d'avance !!!
j'ai super besoin d'aide !!
j'utilise Visual C++, et je sais pas comment eviter les erreurs du type "#include nesting level is 361 deep; possible infinite recursion"
en fait j'ai plusieurs classes, entre autres j'ai une classe Jeu et une classe Joueur, je veux avoir un attribut de type Jeu dans la classe Joueur et un attribut de type Joueur dans la classe Jeu, je suis donc obligé de mettre #include "Joueur.h" dans Jeu.h et #include "Jeu.h" dans Joueur.h.
mais là ca lui plait pas paskil rentre dans une boucle infinie a la compilation, je comprend pourquoi mais je ne sais pas comment eviter ça :(
Merci d'avance !!!
3 réponses
D'abord tu fais quoi du c ou du c++ ?
si tu fais du c++,
il ne faut pas que lorsque tu instancie un jeu, tu instencie aussi un joueur, mais plutot que tu lui en affecte un.
ex :
tu instancie un objet jeu :
new Jeu();
dans ce constructeur, tu vas instancier aussi un joueur en faisant :
new joueur(this); //tu lui passes en argument ton objet jeu.
au niveau de tes fichiers includes, il faut que tu utilises le precompliateur (les lignes de codes qui commencent par #)
en les utilisant correctement, tu peux tester si tu as déja inclus les fichiers ou pas. pour ne pas les inclures indefiniment.
voila, bon courage.
Peguinette...
"Petit à petit on devient moins petit."
si tu fais du c++,
il ne faut pas que lorsque tu instancie un jeu, tu instencie aussi un joueur, mais plutot que tu lui en affecte un.
ex :
tu instancie un objet jeu :
new Jeu();
dans ce constructeur, tu vas instancier aussi un joueur en faisant :
new joueur(this); //tu lui passes en argument ton objet jeu.
au niveau de tes fichiers includes, il faut que tu utilises le precompliateur (les lignes de codes qui commencent par #)
en les utilisant correctement, tu peux tester si tu as déja inclus les fichiers ou pas. pour ne pas les inclures indefiniment.
voila, bon courage.
Peguinette...
"Petit à petit on devient moins petit."
D'abord tu fais quoi du c ou du c++ ?
si tu fais du c++,
il ne faut pas que lorsque tu instancie un jeu, tu instencie aussi un joueur, mais plutot que tu lui en affecte un.
ex :
tu instancie un objet jeu :
new Jeu();
dans ce constructeur, tu vas instancier aussi un joueur en faisant :
new joueur(this); //tu lui passes en argument ton objet jeu.
au niveau de tes fichiers includes, il faut que tu utilises le precompliateur (les lignes de codes qui commencent par #)
en les utilisant correctement, tu peux tester si tu as déja inclus les fichiers ou pas. pour ne pas les inclures indefiniment.
voila, bon courage.
Peguinette...
"Petit à petit on devient moins petit."
si tu fais du c++,
il ne faut pas que lorsque tu instancie un jeu, tu instencie aussi un joueur, mais plutot que tu lui en affecte un.
ex :
tu instancie un objet jeu :
new Jeu();
dans ce constructeur, tu vas instancier aussi un joueur en faisant :
new joueur(this); //tu lui passes en argument ton objet jeu.
au niveau de tes fichiers includes, il faut que tu utilises le precompliateur (les lignes de codes qui commencent par #)
en les utilisant correctement, tu peux tester si tu as déja inclus les fichiers ou pas. pour ne pas les inclures indefiniment.
voila, bon courage.
Peguinette...
"Petit à petit on devient moins petit."
Tout d'abord Merci de t'etre penché sur mon probleme,
en fait j'ai déja essayé de faire des #ifndef,#define,#endif
mais ca a abouti a rien, ca me rajoute des erreurs a la compilation...
pour le premier truc que tu m'as dit, j'ai déja fait ça, je crée dans le constructeur de la classe Jeu, un objet Joueur en lui passant en parametre le Jeu. mais dans ce cas là il faut quand meme inclure "Jeu.h" dans "Joueur.h", et là ca foire...
jvais continuer a chercher une solution avec les #...
merci encore, a++
Darkman
en fait j'ai déja essayé de faire des #ifndef,#define,#endif
mais ca a abouti a rien, ca me rajoute des erreurs a la compilation...
pour le premier truc que tu m'as dit, j'ai déja fait ça, je crée dans le constructeur de la classe Jeu, un objet Joueur en lui passant en parametre le Jeu. mais dans ce cas là il faut quand meme inclure "Jeu.h" dans "Joueur.h", et là ca foire...
jvais continuer a chercher une solution avec les #...
merci encore, a++
Darkman
bon voila darkman, ce que tu v faire est impossible car a la compilation voila ce que va faire le compilateur :
ds jeu.h, il va voir #include"joueur.h" et il va voir ds "joueur.h" et la encore, il voit #include"jeu.h" et ainsi de suite, ce sera des appels sans fin entre les 2 fichiers, d'ou l'erreur, en objet impossible cela.
Voila ce q tu vas faire :tu crees tes 2 classes sans y mettre les agregations, i evoila :
class CJeu
{//donnes qui st propres a jeu et methodes. sans instance de CJoueur
};
class CJoueur
{//donnes et methodes propres sans instance de CJeu
}
//methode 1 :
Ensuite,tu crees un fichier assoc.h et tu fais :
class CAssoc
{
CJeu *unJeu;//liste de jeux
CJoueur *unJoueur;//lioste de joueurs
public:
void ajouter(Cjoueur *joueur, int pos);
void supprimer(Cjeu *jeu,int pos);
//..., en fait ces 2 methodes st juste des exemples, tu fais ce q tu v
//methode2
tu crees un fichier JoueurSpe.h
class CJoueurSpe : public Cjoueur
{CJeu *unJeu;//une liste de jeu
//etc....
};
puis un fichier JeuSpe.h
class CJeuSpe : public Cjeu
{CJoueur * unJoueur;
//etc..
};
voila, notre prof d'objet a prefere la premiere methode mais moi je prefere la seconde(que j'ai fait moi-meme d'ailleurs).Mais attention, donc pour la methode 2, tes 2 classes Cjeu et CJoueur, tu ne les instancie pas ds le main car t'en a pas besoin, puisque les classes spe st celles dont t'as besoin.
Sinon, si t'es pas satisfait, reponds a dje-dje, peut etre qu'il a une autre solution,effectivement.
tafiscobar
ds jeu.h, il va voir #include"joueur.h" et il va voir ds "joueur.h" et la encore, il voit #include"jeu.h" et ainsi de suite, ce sera des appels sans fin entre les 2 fichiers, d'ou l'erreur, en objet impossible cela.
Voila ce q tu vas faire :tu crees tes 2 classes sans y mettre les agregations, i evoila :
class CJeu
{//donnes qui st propres a jeu et methodes. sans instance de CJoueur
};
class CJoueur
{//donnes et methodes propres sans instance de CJeu
}
//methode 1 :
Ensuite,tu crees un fichier assoc.h et tu fais :
class CAssoc
{
CJeu *unJeu;//liste de jeux
CJoueur *unJoueur;//lioste de joueurs
public:
void ajouter(Cjoueur *joueur, int pos);
void supprimer(Cjeu *jeu,int pos);
//..., en fait ces 2 methodes st juste des exemples, tu fais ce q tu v
//methode2
tu crees un fichier JoueurSpe.h
class CJoueurSpe : public Cjoueur
{CJeu *unJeu;//une liste de jeu
//etc....
};
puis un fichier JeuSpe.h
class CJeuSpe : public Cjeu
{CJoueur * unJoueur;
//etc..
};
voila, notre prof d'objet a prefere la premiere methode mais moi je prefere la seconde(que j'ai fait moi-meme d'ailleurs).Mais attention, donc pour la methode 2, tes 2 classes Cjeu et CJoueur, tu ne les instancie pas ds le main car t'en a pas besoin, puisque les classes spe st celles dont t'as besoin.
Sinon, si t'es pas satisfait, reponds a dje-dje, peut etre qu'il a une autre solution,effectivement.
tafiscobar
salut
j ai eu ce meme pb il y a qq mois et j ai eu la reponse dans ce forum,
c etait un peu plus simple : il suffisait de definir dans chacun des fichiers le type de lautre. je m explique (et ca reprend ce que tu as fais unpeu) :
ds jeu.h : tu inseres typedef Joueur Joueur;
et ds joueur.h : typedef Jeu Jeu;
et ca marche
Chmanu
j ai eu ce meme pb il y a qq mois et j ai eu la reponse dans ce forum,
c etait un peu plus simple : il suffisait de definir dans chacun des fichiers le type de lautre. je m explique (et ca reprend ce que tu as fais unpeu) :
ds jeu.h : tu inseres typedef Joueur Joueur;
et ds joueur.h : typedef Jeu Jeu;
et ca marche
Chmanu