Je sais qu'il y a quelques questions similaires (y compris la circulaire) sur stackoverflow et d'autres sites Web. Mais je n'arrive toujours pas à comprendre et aucune solution n'apparaît. Donc, je voudrais poster mon spécifique.
J'ai une classe d'événement qui a 2 et en fait plus de sous-classes, qui sont Arrival et Landing. Le compilateur (g ++) se plaint:
g++ -c -Wall -g -DDEBUG Event.cpp -o Event.o
In file included from Event.h:15,
from Event.cpp:8:
Landing.h:13: error: expected class-name before ‘{’ token
make: *** [Event.o] Error 1
Les gens ont dit que c'était une circulaire. Les 3 fichiers d'en-tête (Event.h Arrival.h Landing.h) sont les suivants:
l'événement.h:
#ifndef EVENT_H_
#define EVENT_H_
#include "common.h"
#include "Item.h"
#include "Flight.h"
#include "Landing.h"
class Arrival;
class Event : public Item {
public:
Event(Flight* flight, int time);
virtual ~Event();
virtual void occur() = 0;
virtual string extraInfo() = 0; // extra info for each concrete event
// @implement
int compareTo(Comparable* b);
void print();
protected:
/************** this is why I wanna include Landing.h *******************/
Landing* createNewLanding(Arrival* arrival); // return a Landing obj based on arrival's info
private:
Flight* flight;
int time; // when this event occurs
};
#endif /* EVENT_H_ */
Arrivée.h:
#ifndef ARRIVAL_H_
#define ARRIVAL_H_
#include "Event.h"
class Arrival: public Event {
public:
Arrival(Flight* flight, int time);
virtual ~Arrival();
void occur();
string extraInfo();
};
#endif /* ARRIVAL_H_ */
Atterrissage.h
#ifndef LANDING_H_
#define LANDING_H_
#include "Event.h"
class Landing: public Event {/************** g++ complains here ****************/
public:
static const int PERMISSION_TIME;
Landing(Flight* flight, int time);
virtual ~Landing();
void occur();
string extraInfo();
};
#endif /* LANDING_H_ */
MISE À JOUR:
J'ai inclus Landing.h car le constructeur de Landing est appelé dans la méthode Event :: createNewLanding:
Landing* Event::createNewLanding(Arrival* arrival) {
return new Landing(flight, time + Landing::PERMISSION_TIME);
}
Remplacer
#include "Landing.h"
avec
class Landing;
Si vous avez toujours des erreurs, postez aussi Item.h
, Flight.h
et common.h
EDIT: En réponse au commentaire.
Vous devrez par exemple #include "Landing.h"
de Event.cpp
afin d’utiliser réellement la classe. Vous ne pouvez simplement pas l'inclure de Event.h
Cela devrait être un commentaire, mais les commentaires n'autorisent pas le code multiligne.
Voici ce qui se passe:
dans Event.cpp
#include "Event.h"
le préprocesseur commence à traiter Event.h
#ifndef EVENT_H_
il n'est pas encore défini, alors continuez
#define EVENT_H_
#include "common.h"
common.h
est traité correctement
#include "Item.h"
Item.h
est traité correctement
#include "Flight.h"
Flight.h
est traité correctement
#include "Landing.h"
le préprocesseur commence à traiter Landing.h
#ifndef LANDING_H_
pas encore défini, continuez
#define LANDING_H_
#include "Event.h"
le préprocesseur commence à traiter Event.h
#ifndef EVENT_H_
Ceci IS est déjà défini, le reste du fichier est ignoré. Continuez avec Landing.h
class Landing: public Event {
Le préprocesseur s'en fiche, mais le compilateur dit "WTH, c'est Event
? Je n'ai pas encore entendu parler de Event
."
Si vous déclarez en avant Flight
et Landing
dans Event.h
, alors vous devriez être réparé.
Se souvenir de #include "Flight.h"
et #include "Landing.h"
dans votre fichier d’implémentation pour Event
.
La règle générale est la suivante: si vous en dérivez, composez ou utilisez-le par valeur, le compilateur doit connaître sa définition complète au moment de la déclaration. Si vous composez à partir d'un pointeur, le compilateur saura à quel point il est gros. De même, si vous passez une référence à cette dernière, le compilateur saura également quelle est la taille de la référence.