J'essaie d'apprendre le c ++ et je suis tombé sur une erreur en essayant de comprendre l'héritage.
Compilation: daughter.cppIn fichier inclus à partir de /home/jonas/kodning/testing/daughter.cpp:1:/home/jonas/kodning/testing/daughter.h:6: erreur: classe attendue- nom avant jeton '{' Processus terminé avec le statut 1 (0 minutes, 0 secondes) 1 erreurs, 0 avertissements
Mes fichiers: 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;
}
mère.cpp:
#include "mother.h"
#include "daughter.h"
#include <iostream>
using namespace std;
mother::mother()
{
//ctor
}
void mother::saywhat() {
cout << "WHAAAAAAT" << endl;
}
mère.h:
#ifndef MOTHER_H
#define MOTHER_H
class mother
{
public:
mother();
void saywhat();
protected:
private:
};
#endif // MOTHER_H
fille.h:
#ifndef DAUGHTER_H
#define DAUGHTER_H
class daughter: public mother
{
public:
daughter();
protected:
private:
};
#endif // DAUGHTER_H
et daughter.cpp:
#include "daughter.h"
#include "mother.h"
#include <iostream>
using namespace std;
daughter::daughter()
{
//ctor
}
Ce que je veux faire, c'est laisser ma fille hériter de tout ce qui est public de la classe mère (= saywhat ()). Qu'est-ce que je fais mal?
Vous avez oublié d'inclure mother.h
ici:
#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
Vous devez inclure cet en-tête, car daughter
est dérivé de mother
. Le compilateur doit donc connaître la définition de mother
.
Tout d'abord, vous devez inclure des gardes dans les fichiers d'implémentation. Retirez-les.
Deuxièmement, si vous héritez d'une classe, vous devez inclure l'en-tête où la classe est définie.
Dans daughter.cpp, basculez les deux lignes de include. c'est à dire.
#include "mother.h"
#include "daughter.h"
Ce qui s’est passé est que le compilateur a examiné la définition de la classe daughter
et n’a pas trouvé la définition de la classe de base mother
. Donc, il vous dit que "je m'attends à l'identifiant mother
devant" {"dans la ligne
class daughter: public mother {
être une classe, mais je ne trouve pas sa définition! "
Dans mother.cpp
, supprimez l'inclusion de daughter.h
. Le compilateur n'a pas besoin de connaître la définition de daughter.h
; i.e. class mother
peut être utilisé sans daughter
. L'ajout de daughter.h
introduit une dépendance inutile entre les définitions de classe.
D'un autre côté, il est toujours préférable à mon humble avis de conserver l'inclusion de l'en-tête dans la définition de la classe (.cpp) et non la déclaration de la classe (.h). De cette façon, il est moins probable que vous deviez résoudre le cauchemar de l'inclusion des en-têtes lorsque vous incluez des en-têtes qui incluent d'autres en-têtes que vous ne contrôlez pas. Mais de nombreux codes de production incluent un en-tête dans leur en-tête. Les deux sont corrects, juste besoin d'être prudent lorsque vous faites cela.
Vérifiez que #ifndef
et #define
dans votre fichier d’en-tête est unique.
#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