Zeer eenvoudige overerving: fout: verwachte klassenaam vóór ‘{‘-token

Ik probeer c++ te leren en ik ben een fout tegengekomen bij het uitzoeken van overerving.

Compilatie: dochter.cpp
In bestand opgenomen van /home/jonas/kodning/testing/daughter.cpp:1:
/home/jonas/kodning/testing/daughter.h:6: fout: verwachte klassenaam vóór ‘{‘-token
Proces beëindigd met status 1 (0 minuten, 0 seconden)
1 fouten, 0 waarschuwingen

Mijn bestanden:
main.cpp:

#include "mother.h"
#include "daughter.h"
#include <iostream>
using namespace std;
int main()
{
    cout << "Hello world!" << endl;
    mother mom;
    mom.saywhat();
    return 0;
}

moeder.cpp:

#include "mother.h"
#include "daughter.h"
#include <iostream>
using namespace std;
mother::mother()
{
    //ctor
}
void mother::saywhat() {
    cout << "WHAAAAAAT" << endl;
}

moeder.h:

#ifndef MOTHER_H
#define MOTHER_H
class mother
{
    public:
        mother();
        void saywhat();
    protected:
    private:
};
#endif // MOTHER_H

dochter.h:

#ifndef DAUGHTER_H
#define DAUGHTER_H
class daughter: public mother
{
    public:
        daughter();
    protected:
    private:
};
#endif // DAUGHTER_H

en dochter.cpp:

#include "daughter.h"
#include "mother.h"
#include <iostream>
using namespace std;
daughter::daughter()
{
    //ctor
}

Wat ik wil doen is de dochter alles publiekelijk laten erven van de moederklasse (=saywhat()). Wat doe ik verkeerd?


Antwoord 1, autoriteit 100%

Je bent vergeten mother.hhier op te nemen:

#ifndef DAUGHTER_H
#define DAUGHTER_H
#include "mother.h"  //<--- this line is added by me.    
class daughter: public mother
{
    public:
        daughter();
    protected:
    private:
};
#endif // DAUGHTER_H

U moet deze koptekst opnemen, omdat daughteris afgeleid van mother. Dus de compiler moet de definitie van motherkennen.


Antwoord 2, autoriteit 32%

Verwissel in dochter.cpp de twee regels van include. d.w.z.

#include "mother.h"
#include "daughter.h"

Wat er gebeurde was dat de compiler de definitie van klasse daughteronderzoekt en de definitie van de basisklasse motherniet kon vinden. Dus het vertelt je dat “Ik verwacht de identifier mothervoor “{” in de regel

class daughter: public mother {

een klas zijn, maar ik kan de definitie ervan niet vinden!”

In mother.cppverwijder je de toevoeging van daughter.h. De compiler hoeft de definitie van daughter.hniet te kennen; d.w.z. klasse motherkan worden gebruikt zonder daughter. Het toevoegen van daughter.hintroduceert onnodige afhankelijkheid tussen de klassedefinities.

Aan de andere kant is het IMHO altijd beter om de header op te nemen in de definitie van de klasse (.cpp) en niet de declaratie van de klasse (.h). Op deze manier is het minder waarschijnlijk dat u de nachtmerrie van het opnemen van kopteksten moet oplossen wanneer u kopteksten opneemt die op hun beurt andere kopteksten bevatten waarover u geen controle heeft. Maar veel productiecode bevat header in header. Beide zijn correct, je moet alleen voorzichtig zijn als je dat doet.


Antwoord 3, autoriteit 29%

Niet gerelateerd aan het probleem van OP, maar voor alle andere C++-leerlingen die dit tegenkwamen, kreeg ik deze fout om een andere reden. Als uw bovenliggende klas een sjabloon heeft, moet u de typenaam opgeven in de onderliggende klas:

#include "Parent.h"
template <typename ChildType>
class Child : public Parent<ChildType> { // <ChildType> is important here
};

Antwoord 4, autoriteit 19%

Controleer of #ifndefen #definein uw headerbestand uniek zijn.

#ifndef BASE_CLIENT_HANDLER_H
#define BASE_CLIENT_HANDLER_H
#include "Threads/Thread.h"
class BaseClientHandler : public threads::Thread {
public:
    bool isOn();
};
#endif //BASE_CLIENT_HANDLER_H

Antwoord 5, autoriteit 16%

Ten eerste moet u bewakers opnemen in implementatiebestanden. Verwijder ze.

Ten tweede, als je van een klasse erft, moet je de koptekst opnemen waarin de klasse is gedefinieerd.

Other episodes