Méthodes virtuelles, création d'interface.

Méthodes virtuelles, création d'interface. - C++ - Programmation

Marsh Posté le 17-11-2006 à 14:31:00    

Bien le bonjour à tous,
Je viens vous demander un peu d'aide parce que j'ai un problème que je n'arrive pas à résoudre.
Mon problème est de faire pour un projet un solver sudoku avec cloisonnement des classes et de l'interface graphique.
Le prof nous ayant donné un fichier permettant de faire le lien entre notre interface graphique (ici console) et nos classe mais je me choppe des erreurs à la compilation.
 
Voici le fichier d'interface (classe de base) :
 

Code :
  1. #ifndef INTERFACE_SUDOKU
  2. #define INTERFACE_SUDOKU
  3. class InterfaceSudoku
  4. {
  5. public:
  6.        
  7. virtual void setValeur(int i,int j,int value);
  8. virtual void delValeur(int i,int j);
  9. virtual int getValeur(int i,int j);
  10. virtual void getPossibilite(int i,int j, bool * possibilite);
  11. virtual void resoudre();
  12. virtual void genere();
  13. virtual void vide(int difficulte);
  14. };
  15. #endif


 
Voici la classe qui hérite de cette classe :

Code :
  1. #ifndef __PLATEAU__
  2. #define __PLATEAU__
  3. #inclusion diverses
  4. class Plateau : public InterfaceSudoku {
  5. Region * regions[NB_REGION_PAR_LIGNE][NB_REGION_PAR_COLONNE];
  6. Ligne * lignes[NB_LIGNE_PLATEAU];
  7. Colonne * colonnes[NB_COLONNE_PLATEAU];
  8. vector<Elt> parcours;
  9. vector<Case*> parcoursAleatoire;
  10. public :
  11.     void setValeur(int i,int j,int value);
  12.    
  13.     void delValeur(int i,int j);
  14.    
  15.     int getValeur(int i,int j);
  16.    
  17.     void getPossibilite(int i,int j, bool * possibilite);
  18.    
  19.     void resoudre();
  20.    
  21.     void genere();
  22.    
  23.     void vide(int difficulte);
  24. };
  25. #endif


 
Voici comment l'on ma dit d'utiliser ensuite la classe dans la fonction main pour instancier un objet du type plateau :

Code :
  1. Interface * Interf = new Plateau();


 
Et voici les messages d'erreur que je me chope :

FonctionsStatiques.o(.gnu.linkonce.t._ZN15InterfaceSudokuC2ERKS_+0x8): In function `InterfaceSudoku::InterfaceSudoku(InterfaceSudoku const& )':
: undefined reference to `vtable for InterfaceSudoku'
Plateau.o(.gnu.linkonce.t._ZN15InterfaceSudokuC2Ev+0x8): In function `InterfaceSudoku::InterfaceSudoku()':
: undefined reference to `vtable for InterfaceSudoku'
Plateau.o(.gnu.linkonce.r._ZTI7Plateau+0x8): undefined reference to `typeinfo for InterfaceSudoku'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [sudoku_solver] Erreur 1


 
Est-ce que je me trompe dans la déclaration des mes classes ? Après le prof m'a expliqué qu'il fallait utiliser les fonctions virtuelles de la classe Interface pour qu'il aille chercher les fonctions de la classe Plateau. Ainsi si quelqu'un voudrait utiliser mon interface avec ses classes, celà peut se faire sans modifications importantes.
 
Le problème peut être aussi c'est que je doit inclure le fichier plateau.h dans un fichier contenant les fonctions "statiques" permettant la résolution du sudoku, mais le fichier fonctionsstatiques.h inclus également le fichier plateau.h. Cet sorte de dépendance cyclique me sort des erreurs de compilation malgrès les #ifndef Constante et #define Constante. Je contourne ce truc en incluant "fonctionsstatiques.h" dans le plateau.cpp.
 
Comment faire des includes cyclique sans que celà pose problème au niveau de la compilation ? Les conditions #ifndef et la définition de la constante ne devrait-elles pas résoudre les inclusions au niveau du préprocesseur et ne pas inclure deux fois le fichier entete.
 
En vous remerçiant d'avance pour l'aide que vous pourrez m'apporter et désolé pour la longueur du post.
@ +  :wahoo:  

Reply

Marsh Posté le 17-11-2006 à 14:31:00   

Reply

Marsh Posté le 17-11-2006 à 14:39:28    


 
 
 
 
neomenphys1 a écrit :
 
 
[quote]Est-ce que je me trompe dans la déclaration des mes classes ? [/quotemsg]
Les methodes de ta classe tableau peuvent rester virtuelles, et proposer une implementation pour le plateau. Ca manque de constructeur et de destructeur aussi.

 

[quote]Comment faire des includes cyclique sans que celà pose problème au niveau de la compilation ? [/quotemsg]
Non, il faut faire ca correctement, sinon tu as un probleme de conception.


---------------
Töp of the plöp
Reply

Marsh Posté le 17-11-2006 à 15:06:49    

l'intéret de cette interface ?
 
sinon reprend ton cours de C++ ... il est où le destructeur virtuel !
c'est quoi ce include guard à la noix ? tu veux pas carrément utiliser STACK_H tant qu'à faire ?

Reply

Marsh Posté le 17-11-2006 à 15:10:22    

Je percute que maintenant, mais l'interface de cloisonnement a ete bien interpretee ?  
A mon sens pour cloisonner l'IHM du reste du cote on utilise une Facade (ou interface) au sens pattern, pas au sens objet.
 
(dsl pour les accents je suis sur un clavier US)


---------------
Töp of the plöp
Reply

Marsh Posté le 17-11-2006 à 17:54:33    

Citation :

Et voici les messages d'erreur que je me chope :
[fixed]FonctionsStatiques.o(.gnu.linkonce.t._ZN15InterfaceSudokuC2ERKS_+0x8): In function `InterfaceSudoku::InterfaceSudoku(InterfaceSudoku const& )':
: undefined reference to `vtable for InterfaceSudoku'
Plateau.o(.gnu.linkonce.t._ZN15InterfaceSudokuC2Ev+0x8): In function `InterfaceSudoku::InterfaceSudoku()':
: undefined reference to `vtable for InterfaceSudoku'
Plateau.o(.gnu.linkonce.r._ZTI7Plateau+0x8): undefined reference to `typeinfo for InterfaceSudoku'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [sudoku_solver] Erreur 1


Tu n'as a pas défini au moins une des fonctions de la classe de base (c'est une erreur au moment de l'édition de lien)
 

Citation :

Le problème peut être aussi c'est que je doit inclure le fichier plateau.h dans un fichier contenant les fonctions "statiques" permettant la résolution du sudoku, mais le fichier fonctionsstatiques.h inclus également le fichier plateau.h. Cet sorte de dépendance cyclique me sort des erreurs de compilation malgrès les #ifndef Constante et #define Constante. Je contourne ce truc en incluant "fonctionsstatiques.h" dans le plateau.cpp.


Ce contournement est la bonne façon de faire.
 

Reply

Sujets relatifs:

Leave a Replay

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