web-dev-qa-db-fra.com

Héritage très basique: erreur: nom de classe attendu avant le jeton ‘{’

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?

15
Jonas

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.

21
Nawaz

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.

5
Luchian Grigore

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.

5
yuklai

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
1
chmoder