fout: verwachte klassenaam vóór ‘{‘-token

Ik weet dat er een aantal vergelijkbare vragen zijn (circulaire omvat) over stackoverflow en andere websites. Maar ik kom er nog steeds niet uit en er komen geen oplossingen uit. Dus ik zou graag mijn specifieke willen posten.

Ik heb een Event-klasse die 2 en eigenlijk meer subklassen heeft, namelijk Aankomst en Landing. De compiler (g++) klaagt:

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

Mensen zeiden dat het een circulaire is. De 3 header-bestanden (Event.h Arrival.h Landing.h) zijn als volgt:

de Event.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_ */

Aankomst.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_ */

Landing.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_ */

UPDATE:

Ik heb Landing.h opgenomen omdat de constructor van Landing wordt aangeroepen in de Event::createNewLanding-methode:

Landing* Event::createNewLanding(Arrival* arrival) {
    return new Landing(flight, time + Landing::PERMISSION_TIME);
}

Antwoord 1, autoriteit 100%

Vervangen

#include "Landing.h"

met

class Landing;

Als je nog steeds fouten krijgt, post dan ook Item.h, Flight.hen common.h

EDIT: als reactie op een opmerking.

U moet b.v. #include "Landing.h"van Event.cppom de klas daadwerkelijk te gebruiken. Je kunt het gewoon niet opnemen vanuit Event.h


Antwoord 2, autoriteit 93%

Dit zou een opmerking moeten zijn, maar in opmerkingen is geen code met meerdere regels toegestaan.

Dit is wat er gebeurt:

in Event.cpp

#include "Event.h"

preprocessor begint Event.h

te verwerken

#ifndef EVENT_H_

het is nog niet gedefinieerd, dus blijf doorgaan

#define EVENT_H_
#include "common.h"

common.hwordt goed verwerkt

#include "Item.h"

Item.hwordt goed verwerkt

#include "Flight.h"

Flight.hwordt goed verwerkt

#include "Landing.h"

preprocessor begint Landing.h

te verwerken

#ifndef LANDING_H_

nog niet gedefinieerd, ga door

#define LANDING_H_
#include "Event.h"

preprocessor begint Event.h

te verwerken

#ifndef EVENT_H_

Dit IS al gedefinieerd, de hele rest van het bestand wordt overgeslagen. Doorgaan met Landing.h

class Landing: public Event {

De preprocessor geeft hier niets om, maar de compiler zegt: “WTH is Event? Ik heb nog niets gehoord over Event.”


Antwoord 3, autoriteit 10%

Als je Flighten Landingdoorstuurt in Event.h, dan zou het opgelost moeten zijn.

Vergeet niet om #include "Flight.h"en #include "Landing.h"in uw implementatiebestand voor Event.

De algemene vuistregel is: als je ervan afleidt, ervan opstelt, of het op waarde gebruikt, moet de compiler de volledige definitie kennen op het moment van declaratie. Als je een aanwijzer opstelt, weet de compiler hoe groot een aanwijzer is. Evenzo, als u er een verwijzing naar doorgeeft, weet de compiler ook hoe groot de verwijzing is.


Antwoord 4, autoriteit 10%

Ik weet dat het een beetje laat is om deze vraag te beantwoorden, maar het is de eerste vermelding in Google, dus ik denk dat het de moeite waard is om deze vraag te beantwoorden.

Het probleem is geen codeerprobleem, het is een architectuurprobleem.

Je hebt een interface class Event: public Itemgemaakt om de methoden te definiëren die alle events moeten implementeren. Dan heb je twee soorten events gedefinieerd die overerven van class Event: public Item; Aankomst en Landing en dan heb je een methode Landing* createNewLanding(Arrival* arrival);toegevoegd vanuit de landingsfunctionaliteit in de class Event: public Iteminterface. U moet deze methode naar de klasse class Landing: public Eventverplaatsen, omdat deze alleen zinvol is voor een landing. class Landing: public Eventen class Arrival: public Eventklasse moet class Event: public Itemmaar evenement mag class Landing: public Eventnoch class Arrival: public Event.

Ik hoop dat dit helpt, groeten, Alberto


Antwoord 5, autoriteit 3%

Ik kreeg dezelfde fout met een ander probleem,

Ik gebruikte naamruimten in mijn headers en vergat het haakje sluiten en kreeg in plaats daarvan deze cryptische fout.

Other episodes