2017-10-07 3 views
0

Je suis réellement novice en C++ et j'essaie de compléter un petit projet pour comprendre l'héritage. J'ai des problèmes avec les déclarations include et forward. Voici les en-têtes suivants qui semble être en cause:Classes d'inclusion circulaire et de déclaration directe

player.h:

#ifndef PLAYER_H 
#define PLAYER_H 
#include "abstractPlayerBase.h" 
#include "cardException.h" 
class abstractPlayerBase; 
class Player: public AbstractPlayerBase 
{ 
    ... 
    //a function throws a CardException 
}; 
#endif 

baseCardException.h:

#ifndef BASECARDEXCEPTION_H 
#define BASECARDEXCEPTION_H 
#include "Player.h" 

class BaseCardException 
{ 
... 
}; 
#endif 

cardException.h:

#ifndef CARDEXCEPTION_H 
#define CARDEXCEPTION_H 
#include "baseCardException.h" 

class Player; //the problem seems to be here 
class CardException: public BaseCardException 
{ 
public: 
    CardException(const Player& p); 
}; 
#endif 

utilisant cette cardException.h je reçois les erreurs: cardException.h: error: expected class-name before ‘{’ token et cardException.h: error: multiple types in one declaration

si j'utilise ceci pour cardException:

#ifndef CARDEXCEPTION_H 
#define CARDEXCEPTION_H 
#include "baseCardException.h" 

class BaseCardException; //this changed 
class CardException: public BaseCardException 
... 

les erreurs: cardException.h: error: invalid use of incomplete type ‘class BaseCardException’ class CardException: public BaseCardException et CardException.h: error: ‘Player’ does not name a type se produit.

Si utiliser les deux déclarations avant: cardException.h:8:7: error: multiple types in one declaration class BaseCardException et cardException.h: error: invalid use of incomplete type ‘class BaseCardException’

Je veux juste savoir ce que je fais mal ici?

+1

'class abstractPlayerBase.h;' est une déclaration forward incorrecte et inutile. Notez également que les erreurs signalées par le compilateur peuvent en fait être le résultat d'un code incorrect dans les fichiers inclus. – orhtej2

+0

'class abstractPlayerBase.h' dans le player.h est une syntaxe invalide. Cela entraînera la rupture de la compilation pour tout fichier d'en-tête contenant player.h. Plutôt que de lire le message d'erreur LAST émis par le compilateur, trhy revenir en arrière et en lisant le premier. Le premier message d'erreur est plus susceptible de représenter un problème réel, tandis que le dernier message d'erreur peut être tronqué en raison de la confusion du compilateur par les problèmes antérieurs. – Peter

+0

Créez un [mcve]. – user2079303

Répondre

1

BaseCardException.h semble contenir la déclaration d'une classe appelée CardException, mais votre convention de dénomination semble indiquer qu'elle doit contenir une classe appelée BaseCardException.

Vous obtenez l'erreur que vous obtenez car le compilateur ne trouve pas la définition de la classe BaseCardException à l'endroit où la classe CardException tente d'en hériter.

De même, où est la définition de la classe AbstractPlayerBase?