Problème de compilation

Problème de compilation - C++ - Programmation

Marsh Posté le 01-05-2008 à 21:45:36    

Désolé de vous harceler de question mais j'ai un gros projet à rendre (je suis en école d'info) et je ne m'en sors pas du c++.
 
Voici mon code :

Code :
  1. class Etat
  2. {
  3. private :
  4.     bool m_est_initial;
  5.     bool m_est_final;
  6.     int m_numero;
  7.     Liste_transitions m_liste_transition;
  8. public :
  9.     Etat();
  10.     Etat(int numero);
  11.     Etat(int numero, bool initial, bool final);
  12.     ~Etat();
  13.     void ajout_transition(int, int,char);
  14.     Liste_etats retour_liste_ND(char c);
  15. };
  16. //la classe Liste_etats contient une liste d'états dans un conteneur de type vector
  17. class Liste_etats
  18. {
  19. private:
  20.     std::vector<Etat> m_tab_etats;
  21. public:
  22.     ~Liste_etats();
  23.     //méthode qui permet l'ajout d'une transition à la liste
  24.     void ajout_etat(int numero, bool initial, bool final);
  25.     int return_size();
  26.     Etat return_first();
  27.     void efface_first();
  28.     void concat(Liste_etats &l2);
  29. };


 
 
En compilant, j'obtiens l'erreur :

Citation :


parse error before '(' token sur la ligne   "Liste_etats retour_liste_ND(char c);"


 
J'imagine que c'est parce que la classe Liste_etats est après la classe où se trouve la ligne de code.
J'ai essayé de le mettre dans des autres fichiers .cpp et .h mais ça ne compile pas non plus.
 
Auriez-vous une solution ?
 
Merci beaucoup


Message édité par sebdu94 le 01-05-2008 à 21:47:09
Reply

Marsh Posté le 01-05-2008 à 21:45:36   

Reply

Marsh Posté le 01-05-2008 à 21:49:05    

forward declaration :o

 
Code :
  1. class Liste_etats;
  2. class Etat
  3. {
  4. // le code ...
  5. };
  6. class Liste_etats
  7. {
  8. // le code ...
  9. };


Message édité par Joel F le 01-05-2008 à 21:57:52
Reply

Marsh Posté le 01-05-2008 à 21:56:32    

Merci beaucoup.
Il ne faut pas mettre le [cpp]  ^^   hein ?

Reply

Marsh Posté le 01-05-2008 à 21:57:56    

quel [cpp] :o

Reply

Marsh Posté le 01-05-2008 à 22:01:33    

Désolé pour ces questions bêtes.
 
 
(J'ai pas rêvé  :??: Tu avais bien mis un [cpp] ?)

Reply

Marsh Posté le 02-05-2008 à 00:36:42    

on met un entourage [cpp]...[/cpp] sur le forum (et pas dans ton code) autour du code qu'on met en exemple ici, pour que ca soit joli a l'affichage (ca met des numeros de lignes et de la couleur...)
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-05-2008 à 12:08:19    

D'accord.Merci pour ta réponse.    
J'ai un autre problème de compilation maintenant.
J'ai fais comme tu m'as dit pour un autre fichier et j'obtiens l'erreur :

Citation :

'Liste_transitions' is used as a type, but not defined as a


 
 
Voici le code de mes deux fichiers :
etats.h

Code :
  1. #include <iostream>
  2. #include <vector>
  3. #include "transition.h"
  4. class Liste_etats;
  5. class Etat
  6. {
  7. private :
  8.     bool m_est_initial;
  9.     bool m_est_final;
  10.     int m_numero;
  11.     Liste_transitions m_liste_transition;
  12. public :
  13.     Etat();
  14.     Etat(int numero);
  15.     Etat(int numero, bool initial, bool final);
  16.     ~Etat();
  17.     void ajout_transition(int, int,char);
  18.     Liste_etats retour_liste_EA(char c);
  19. };
  20. //la classe Liste_etats contient une liste d'états dans un conteneur de type vector
  21. class Liste_etats
  22. {
  23. private:
  24.     std::vector<Etat> m_tab_etats;
  25. public:
  26.     //destructeur
  27.     ~Liste_etats();
  28.     //méthode qui permet l'ajout d'une transition à la liste
  29.     void ajout_etat(int numero, bool initial, bool final);
  30.     Liste_etats retour_liste_EA(char c);
  31. };


 
transition.h

Code :
  1. #include <iostream>
  2. #include <vector>
  3. #include "etats.h"
  4. class Liste_etats;
  5. //la classe Transition contient les infos d'une transition, cad l'état de départ, l'état d'arrivée, et la lettre
  6. class Transition
  7. {
  8. private:
  9.     int m_depart, m_arrivee;
  10.     char m_etiquette;
  11. public:
  12.     Transition();
  13.     Transition(int, int, char);
  14.     int get_arrivee();
  15.     char get_etiquette();
  16. };
  17. //la classe Liste_transitions contient une liste de transitions dans un conteneur de type vector
  18. class Liste_transitions
  19. {
  20. private:
  21.     std::vector<Transition> m_tab_transitions;
  22. public:
  23.     //destructeur
  24.     ~Liste_transitions();
  25.     //méthode qui permet l'ajout d'une transition à la liste
  26.     void ajout_transition(int depart,int arrivee, char lettre);
  27.     Liste_etats retour_liste_EA(char c);
  28. };


 
L'erreur est pour la ligne 14 du premier fichier.
 
Merci d'avance.


Message édité par sebdu94 le 02-05-2008 à 12:30:49
Reply

Marsh Posté le 02-05-2008 à 12:18:14    

Citation :

Liste_transitions m_liste_transition;

Tu utilises un type, Liste_transitions, sans avoir dit au préalable a ton compilo ce que c'était. Normal qu'il rale que tu l'empeche de faire son boulot. Il a pas une boule de cristal pour deviner ce que c'est, Liste_transitions, si tu ne le lui dis pas.  
A+,


Message édité par gilou le 02-05-2008 à 12:19:23

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-05-2008 à 12:32:12    

Pourtant je met le  

Code :
  1. #include "transition.h"


qui contient la classe Liste_transitions en haut du fichier etat.h .
 
ça ne suffit pas ?

Reply

Marsh Posté le 02-05-2008 à 12:46:07    

Vous ne voyez pas ce que je veux dire ?

Reply

Marsh Posté le 02-05-2008 à 12:46:07   

Reply

Marsh Posté le 02-05-2008 à 13:23:57    

Si, mais c'est le problème du serpent qui se mord la queue. Quand tu écris :
#include "etats.h"
le compilateur lit ce fichier, qui fait état de la classe Liste_Transition qu'il ne connait pas encore à cet endroit du code, puisque défini en dessous.


Message édité par Elmoricq le 02-05-2008 à 13:25:18
Reply

Marsh Posté le 02-05-2008 à 13:25:13    

Merci
 
Y a t'il une ou des solution(s) ?

Reply

Marsh Posté le 02-05-2008 à 13:29:23    

Oui, il y a des solutions.

 

Mais ajouter un extern c'est comme coller un bout de scotch sur une machine à gaz, ça fonctionne mais c'est laid. Prends du recul sur ton code : si tu as des fichiers en-têtes qui s'appellent mutuellement, c'est qu'il y a un sérieux problème de conception.


Message édité par Elmoricq le 02-05-2008 à 13:29:28
Reply

Marsh Posté le 02-05-2008 à 13:30:35    

ça compile en faisant :
 

Code :
  1. class Etat;
  2. class Liste_etats;


 
à la place d'inclure etat.h
 
 
Mais est-ce une bonne solution ?
 
 
Encore merci pour la réponse précédente :).

Reply

Marsh Posté le 02-05-2008 à 19:44:23    

oui, le forward declaration est toujours la bonne option

Reply

Marsh Posté le 03-05-2008 à 10:46:17    

Merci !!!!!!!!!!!

Reply

Sujets relatifs:

Leave a Replay

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