[C++] Question basique #include croisés

Question basique #include croisés [C++] - C++ - Programmation

Marsh Posté le 11-10-2003 à 16:53:27    

Bonjour tout le monde,
 
Jusqu'à présent, je m'en sortais relativement facilement avec les #ifndef et les forward déclarations, mais j'arrive maintenant à un cas de figure qui m'embête un peu, et je me casse les dents dessus depuis qqs heures maintenant :|  
 
Voici la situation que je résume à l'aide de 2 fichiers, foobar.h et main.cpp.
 
Fichier foobar.h

Code :
  1. #ifndef _20031012_FOOBAR
  2. #define _20031012_FOOBAR
  3. class Foo {
  4. public:
  5.         Bar* monBar ;
  6.         void maMethode() { monBar->maMethode() ; }
  7. } ;
  8. class Bar {
  9. public:
  10.         Foo* monFoo ;
  11.         void maMethode() { monFoo->maMethode() ; }
  12. } ;


 
Fichier main.cpp

Code :
  1. #include "foobar.h"
  2. int main() {
  3.         Foo* f = new Foo() ;
  4.         Bar* b = new Bar() ;
  5.         f->monBar = b  ; b->monFoo = f  ;
  6.         f->maMethode() ; b->maMethode() ;
  7. }


 
Ce n'est pas dans le fichier main.cpp que se situe le problème, mais je vous l'ai mis si vous vouliez faire l'essai chez vous. Voici le résultat de la compilation :
 
Résultat de la compilation


$> g++ -Wall -pedantic main.cpp
In file included from main.cpp:1:
foobar.h:7: syntax error before `*' token
foobar.h: In member function `void Foo::maMethode()':
foobar.h:8: `monBar' undeclared (first use this function)
foobar.h:8: (Each undeclared identifier is reported only once for each function
   it appears in.)
main.cpp: In function `int main()':
main.cpp:7: `class Foo' has no member named `monBar'
$>


 
J'ai effectué une recherche, mais je n'ai pas trouvé de topics faisant référence à ce cas de fugure particulier (appel d'une fonction membre d'une classe dans une classe, à travers un pointeur). J'imagine qu'il s'agit d'un problème pourtant classique maintes et maintes fois débatu, je m'escuse par avance de la redondance.
 
Si quelqu'un à le courage de me donner un petit coup de main, ca serait sympa !
 
Merci, @+


Message édité par Evadream -jbd- le 11-10-2003 à 17:33:21
Reply

Marsh Posté le 11-10-2003 à 16:53:27   

Reply

Marsh Posté le 11-10-2003 à 17:06:40    

tu veux une "Foward Declaration"
 
class Foo;
 
class Bar
{
   Foo *f;
};
 
 
cela est possible, le compilo sait que Foo existe et comme tous les pointeurs ont la même taille, il est capable d'allouer Foo*.
 
 
et voilà

Reply

Marsh Posté le 11-10-2003 à 17:08:41    

Vire tes inlines et claques les dans le .cpp et fait une forward declaration de Bar

Reply

Marsh Posté le 11-10-2003 à 17:14:54    

Taz a écrit :

tu veux une "Foward Declaration"
 
class Foo;
 
class Bar
{
   Foo *f;
};
 
 
cela est possible, le compilo sait que Foo existe et comme tous les pointeurs ont la même taille, il est capable d'allouer Foo*.
 
 
et voilà


 
C'est la première chose que j'ai essayé (avant de faire ce topic), mais le soucis vient alors de l'appel à la fonction monBar->maMethode, qu'il ne connait pas.
 

*Syl* a écrit :

Vire tes inlines et claques les dans le .cpp et fait une forward declaration de Bar


 
Je vais essayer ainsi, merci !


Message édité par Evadream -jbd- le 11-10-2003 à 17:15:27
Reply

Marsh Posté le 11-10-2003 à 17:34:39    

Ca marche en effet beaucoup mieux en définissant les fonctions dans un cpp ! Merci à toi !

Reply

Marsh Posté le 16-10-2003 à 19:31:27    

il me semble que tu peux déclaré un pointeur vers une classe en forward definition, mais tu ne peux pas utiliser ses méthodes (tu ne les as pas encore déclarées au compilo). Ainsi, en mettant les définitions de tes méthodes dans un .cpp, la définition (pas forward) de la classe a déjà été lu par le compilo, donc il en connait les méthodes.


---------------
-( BlackGoddess )-
Reply

Sujets relatifs:

Leave a Replay

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