Classe non reconnue

Classe non reconnue

par Gaétan Herold,
Number of replies: 2


Bonjour à tous,


Avec mon binôme nous sommes confrontés au problème suivant:


Nous avions créé une classe player et dans une classe game, nous créions un static vector de player. Nous avions regroupé tout cela dans un même .h et cela compilait. Pour des raisons que je ne détaille pas ici, nous avons dû créer deux .h différents. Nous avons alors pris soin de mettre les include nécessaires. Cependant, lors de la création du vecteur de player, make prétend que le type vecteur n’est pas défini. 

Je joins ici une capture d’écran. Elle a été caviardée pour respecter les règles du forum.

Merci d’avance de vos réponses.


Gaétan Herold


In reply to Gaétan Herold

Re: Classe non reconnue / dépendance mutuelle de deux modules -> prédéclarer vos classes

par Ronan Boulic,

OK je confirme que votre "caviardage" respecte les règles du forum.

1) Concernant votre problème, d'après les directives includes, vous avez créé deux modules qui dépendent l'un de l'autre. ça n'est pas interdit mais c'est une sorte de warning d'un problème de conception. En tout cas c'est la cause de votre problème de compilation comme on va le voir au point 3.

2) Tout d'abord ça serait franchement plus clair en renommant classgame.h en player.h puisqu'il exporte la déclaration de la classe Player.  Je ne comprends pas ce choix de nom.

3) La dépendance mutuelle entre 2 modules cause une erreur de compilation quand on oubli de prédéclarer les types. Mettons-nous à la place du préprocesseur pour comprendre le problème:

      classgame.h inclut game.h ( qui inclut classgame.h mais cette inclusion est ignorée grâce au header guard -> voir cours)

     Conséquences: dans le fichier game.h qui est inclus dans classgame.h se trouve le vector de Player qui produit l'erreur de compilation

                                  -> le compilateur rencontre un vector de Player AVANT même d'avoir vu la déclaration de la classe Player -> type inconnu

Solution : faire précéder la directive include d'une prédéclaration de la classe dans chacun des fichiers en-tête. dans votre cas:

Dans classgame.h:
.....
class Player;
#include "game.h"
....


et vice-versa dans game.h