IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Héritage simple : error: expected class-name before ‘{’ token


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 43
    Points : 31
    Points
    31
    Par défaut Héritage simple : error: expected class-name before ‘{’ token
    Bonjour,

    Je débute en C++ et je rencontre un problème sur lequel je bute depuis près de 2h, sans trouver de solution.

    Voici un exemple de code :

    Code A.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #ifndef A_H
    #define A_H
     
    #include <iostream>
    #include <vector>
    #include "B.h"
    #include "C.h"
     
    class B;
     
    class A{
    	private :
    	std::string nom;
    	std::vector<B> Bs;
    	std::vector<C> Cs;
     
    	public :
            ...
    };
     
    #endif

    Code B.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #ifndef B_H
    #define B_H
     
    #include "A.h"
    #include <iostream>
     
    class A;
     
    class B{
    	private :
    	std::string nom;
    	B *b;
     
    	public :
    	...
    };
     
    #endif

    Code C.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #ifndef C_H
    #define C_H
     
    #include "A.h"
    #include "B.h"
     
    #include <vector>
    #include <iostream>
     
    class C : public B {
     
    	private :
            ...
     
    	public :
    	...
    };
     
    #endif

    Maintenant, lorsque je compile, j'obtiens l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: expected class-name before ‘{’ token
    J'ai remarqué que lorsque j'enlève std::vector<C> Cs; dans A.h, ça compile.
    Par contre, si dans C.h, je rajoute la ligne class B;, j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: forward declaration of ‘struct B’
    Je précise aussi que les fichiers .cpp sont tous vides.

    Quelqu'un pourrait-il m'aider ?

    merci.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    tu as des inclusions cycliques -> FAQ

    Est-tu sur que tout tes include sont indispensable ?
    Si c'est le cas fais des déclarations anticipées comme tu l'as déjà fais et met tes inclusions dans le cpp au moins pour un fichier pour casser le cycle.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 43
    Points : 31
    Points
    31
    Par défaut
    Merci pour la réponse.

    Néanmoins, je n'arrive pas à corriger l'erreur

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Tes fichiers d'en têtes utilisent ceinture et bretelles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef A_H
    #define A_H
     
    #include <iostream>
    #include <vector>
    #include "B.h" // ceinture
    #include "C.h"
     
    class B; // bretelle
     
    class A{
    Avec la déclaration anticipée, tu n'inclue pas l'en-tête complet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #ifndef A_H
    #define A_H
     
    #include <iostream>
    #include <vector>
     
    class B; // declaration
    class C; // declaration
     
    class A{
    Dans le .cpp, tu mets l'inclusion :
    a.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "a.h"
    #include "b.h"
    #include "c.h"

  5. #5
    Nouveau membre du Club
    Inscrit en
    Août 2007
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 43
    Points : 31
    Points
    31
    Par défaut
    Merci, c'est corrigé !

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/11/2011, 11h25
  2. expected class-name before ‘{’ token la fameuse
    Par frboyer dans le forum Langage
    Réponses: 6
    Dernier message: 13/04/2010, 18h11
  3. Expected class-name before {
    Par Invité4 dans le forum C++
    Réponses: 10
    Dernier message: 23/03/2009, 21h24
  4. erreur: expected class-name before «{"
    Par mansour67 dans le forum wxWidgets
    Réponses: 7
    Dernier message: 08/04/2008, 18h57
  5. Réponses: 5
    Dernier message: 05/05/2006, 18h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo