[c++] include qui boucle, comment je fait ???

include qui boucle, comment je fait ??? [c++] - Programmation

Marsh Posté le 22-03-2002 à 19:20:33    

Bon alors voilà, j'ai un fichier bot.h qui inclut weapon.h qui inclut BulletManager.h qui inclut lui même une classe dérivée de bot.h... ce qui nous fait une belle boucle, et VC++ 6 n'arrive pas à s'en dépétrer...
 
Alors j'avais penser faire une super-classe bot, avec des fonctions virtuelles et mettre ça dans BulletManager, comme ça pas de boucle...
 
Mais bon, je pensait qu'on pouvait faire mieux, et mon prof d'info m'a dit de déclarer la classe et les prototypes avant...
 
alors dans bot.h , je n'inclus pas weapon, et je met à la place :
class weapon;
 
quand je compile, ça marche, mais si j'essaie de faire
weapon * = new weapon [2];
 
il me dit qu'il trouve pas le constructeur... alors que j'ai vérifié, weapon possède bien un constructeur par défaut...
 
bon alors je me dit, pas grave je vais mettre le prototype comme a dit le prof, comme ça il le trouvera, ce qui nous donne :
 
class weapon;
weapon::weapon();
 
mais là, il met : use of undefined class weapon...
 
bon je commence à croire, que je faire mon coup de la super-classe, mais je tente ici au cas ou vous auriez une idée...
 
Je tiens à préciser qu'il s'agit d'un cas de boucle et pas juste de deux fichiers comme ça...
 
une idée siouplait...

Reply

Marsh Posté le 22-03-2002 à 19:20:33   

Reply

Marsh Posté le 22-03-2002 à 19:24:53    

Est-ce que tu mets des directives pour prévenir l'inclusion multiple?
 
#ifdef MONFICHIER_H
#define MONFICHIER_H
 
// contenu du header
 
#endif

Reply

Marsh Posté le 22-03-2002 à 19:32:15    

je suis d'accord avec le monsieur.

Reply

Marsh Posté le 23-03-2002 à 00:08:01    

oui,oui, j'avais oublier de le préciser...
en plus avec vc++ 6, c'est facile, y'a la macro oneTimeInclude...
Non,merci mais c'est pas ça, une autre idée ?

Reply

Marsh Posté le 23-03-2002 à 01:07:12    

une solution est de ne déclarer qu'un pointeur dans le .h et de faire l'include dans le .cpp (ou .c)
 
eg la class otherClass utilise la class myFile, et la classe myFile utilise la classe otherClass :
 
// myFile.h :
 
class otherClass;
 
class myFile
{
  myFile();
  otherClass* myOtherClass;
}
 
// myFile.cpp :
 
#include "otherClass.h";
 
myFile::myFile()
{
   myOtherClass = otherClass;
}
 
//
 
je file l'exemple en c++, c'est le même principe en C.
 
il est également possible que ce soit un problème de design.

Reply

Marsh Posté le 23-03-2002 à 01:59:38    

Fucky_Fuck a écrit a écrit :

 
alors dans bot.h , je n'inclus pas weapon, et je met à la place :
class weapon;
quand je compile, ça marche, mais si j'essaie de faire
weapon * = new weapon [2];
il me dit qu'il trouve pas le constructeur... alors que j'ai vérifié, weapon possède bien un constructeur par défaut...




 
weapon est une classe vide tant que tu ne l'as
pas defini en entier! (avec ses membres)
C'est donc logique que tu ne puisses pas appeler le constructeur.
 
Mettre 'class weapon;' dans bot.h
n'exclut pas d'inclure le header necessaire
dans ton bot.cpp
C'est pour ca qu'on separe declaration
et implantation: tu n'as pas besoin d'inclure
les cpp par contre, les .h doivent bien
etre inclus quelque part.
 
De plus dans la phase de compilation considere
chaque .cpp comme un module a part entiere
une compilation d'un .cpp n'influe pas sur  
la compilation d'un autre .cpp.
C'est lors de l'edition des liens que la reunion
se fera. Ce qui veut dire qu'un .cpp ne peut se contenter
d'une definition incomplete.
 
A+
LEGREG

 

[jfdsdjhfuetppo]--Message édité par legreg--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 23-03-2002 à 13:08:13    

Ah ça y est j'ai compris...
Merci beaucoup, là vous me sauvez la vie...

Reply

Marsh Posté le 23-03-2002 à 17:29:18    

Ace17 a écrit a écrit :

Est-ce que tu mets des directives pour prévenir l'inclusion multiple?
 
#ifdef MONFICHIER_H
#define MONFICHIER_H
 
// contenu du header
 
#endif  




#ifndef MONFICHIER_H

Reply

Marsh Posté le 23-03-2002 à 18:39:21    

*Syl* a écrit a écrit :

 
#ifndef MONFICHIER_H  




 
Oulalala! Je suis impardonnable!! Désolé pour cette erreur grossiere!  :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed