problème de classes qui s'incluent entre elles

problème de classes qui s'incluent entre elles - C++ - Programmation

Marsh Posté le 22-03-2008 à 13:46:05    

Bonjour à tous!
 
J'ai un petit problème dans un grand problème que je réalise. J'ai deux classes A et B, et j'ai une méthode de la classe A qui utilise une instance de la classe B. De la même manière j'ai une méthode de la classe B qui utilise  une instance de la classe A. J'ai bien mis dans chacune des classes A et B les #include "A.h" et #include "B.h", mais au momment de la compilation j'ai un message d'erreur qui ne provient que de la class B : B.h:41: erreur: A has not been declared
Par contre dans la classe A je n'est pas de meesage d'erreur.
 
Je n'arrive pas à savoir à quoi est du cette erreur, peut-être simplement est-il impossible en C++ d'inclure deux classes entre-elles (car c'est peut-être une façon de procéder illogique de ma part). C'est pourquoi je demande votre aide.
 
Merci d'avance

Reply

Marsh Posté le 22-03-2008 à 13:46:05   

Reply

Marsh Posté le 22-03-2008 à 14:11:03    

forward declaration :o
 
B.hpp

Code :
  1. class A;
  2. class B
  3. {
  4.   public :
  5.   void do_stuff( const A& a );
  6. };


 
A.hpp

Code :
  1. class B;
  2. class A
  3. {
  4.   public :
  5.   void do_stuff( const B& b );
  6. };


 
Ne fonctionne que si tu utilises des références ou pointeurs sur A/B.

Reply

Marsh Posté le 22-03-2008 à 14:36:52    

j'ajouterais que deux classes A et B ne peuvent hériter l'une de l'autre
 
class A : public B {};
class B : public A {};
 
ni ne peuvent s'aggréger l'une l'autre
 
class A { B b; };
class B { A a; };
 
C'est interdit car non seulement de tels types auraient des tailles infinies, mais de toute façon c'est complètement illogique.


Message édité par jesus_christ le 22-03-2008 à 14:37:24
Reply

Marsh Posté le 22-03-2008 à 14:40:53    

benito59650 a écrit :

Bonjour à tous!
 
J'ai un petit problème dans un grand problème que je réalise. J'ai deux classes A et B, et j'ai une méthode de la classe A qui utilise une instance de la classe B. De la même manière j'ai une méthode de la classe B qui utilise  une instance de la classe A. J'ai bien mis dans chacune des classes A et B les #include "A.h" et #include "B.h", mais au momment de la compilation j'ai un message d'erreur qui ne provient que de la class B : B.h:41: erreur: A has not been declared
Par contre dans la classe A je n'est pas de meesage d'erreur.
 
Je n'arrive pas à savoir à quoi est du cette erreur, peut-être simplement est-il impossible en C++ d'inclure deux classes entre-elles (car c'est peut-être une façon de procéder illogique de ma part). C'est pourquoi je demande votre aide.
 
Merci d'avance


 
Si l'instance est dans les paramètres, passe le paramètre par const-reference comme l'indique Joel F.
Si l'instance est dans le code de la fonction, écrit le code à part, pas directement dans la classe (pas "inline" à la java quoi).
 

Code :
  1. class A
  2. {
  3.    void f();
  4. };
  5. class B
  6. {
  7.    void g();
  8. };
  9. void A::f()
  10. {
  11.    B b;
  12.    b.g();
  13. }
  14. void B::g()
  15. {
  16.    A a;
  17.    a.f();
  18. }

Reply

Marsh Posté le 22-03-2008 à 15:28:55    

Merci de vos réponse.
 
J'ai modifié mon code en tenant compte de vos remarques, mais j'ai un nouveau message d'erreur.
voilà la déclaration de la méthode qui pose problème:
 
virtual void calculImpactAleas(int periode, const Aleas& A, const Entreprise* E, const Marche* M);  
 
message d'erreur:
SecteurDActivite.h:41: erreur: expected «," or «..." before «*" token
SecteurDActivite.h:41: erreur: ISO C++ forbids declaration of «Entreprise" with no type
 
Explication :  
c'est une méthode de la classe SecteurDActivite, qui utilise en paramètre des instances des classes Entreprises, Marche et Aleas. Mais dans les classes Entreprise et Marche, j'utilise des méthodes qui prennent en paramètres des SecteurDActivite.
 
Pour être clair Aleas ne pose pas de problème, et ma classe A de tout à l'heur est la classe Entreprise ou la classe Marche et la classe B et la classe SecteurDActivite.
 
Merci encore pour votre aide

Reply

Marsh Posté le 22-03-2008 à 16:03:05    

C'est bon en fait ça marche!!
 
Merci beaucoup messieurs

Reply

Sujets relatifs:

Leave a Replay

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