web-dev-qa-db-fra.com

erreur: nom de classe attendu avant le jeton ‘{’

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);
}
41
draw

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

25
Erik

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."

80
Ben Voigt

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.

3
Andy Finkenstadt