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.h
hier 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 daughter
is afgeleid van mother
. Dus de compiler moet de definitie van mother
kennen.
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 daughter
onderzoekt en de definitie van de basisklasse mother
niet kon vinden. Dus het vertelt je dat “Ik verwacht de identifier mother
voor “{” in de regel
class daughter: public mother {
een klas zijn, maar ik kan de definitie ervan niet vinden!”
In mother.cpp
verwijder je de toevoeging van daughter.h
. De compiler hoeft de definitie van daughter.h
niet te kennen; d.w.z. klasse mother
kan worden gebruikt zonder daughter
. Het toevoegen van daughter.h
introduceert 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 #ifndef
en #define
in 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.