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 :

[Débutant] expected class-name before '{' token


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Points : 10
    Points
    10
    Par défaut [Débutant] expected class-name before '{' token
    Bonjour,

    J'ai un petit problème assez bizarre. Enfin c'est toujours ce qu'on dit quand on a pas compris comment le résoudre ...

    Je vais essayer de me faire comprendre : j'ai reproduit de manière simplifiée mon problème qui ne contient plus que 3 classes. En plus, elles sont quasi vides !! Il est clair que le problème vient de l'inclusion des fichiers.

    Premièrement j'ai une classe A. J'ai donc un fichier A.h qui ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #if !defined (A_H)
      #define A_H
     
    #include "Z.h"
     
    class A  {
         A();
         ~A();
     };
     
    #endif
    Si j'inclus ici le fichier Z.h c'est parce que j'ai besoin d'utiliser des objets Z dans cette classe. Le fichier d'entête de la classe Z ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #if !defined (Z_H)
      #define Z_H
     
    #include "B.h"
     
    class Z  {
        Z();
        ~Z();
    };
     
    #endif
    Rien de mal encore ... J'imagine que vous voyez où on va : j'ai inclus le fichier B.h parce que j'ai besoin d'objets B dans la classe Z (non montré ici pour simplifié). La classe B hérite de la classe A :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #if !defined(B_H)
       #define B_H
     
     #include "A.h"
     
     class B : public A {
     public:  
         B() {}
         ~B() {}
     };
     
     #endif
    Evidemment, je suis obligé d'inclure le fichier A.h ici. Les fichiers A.cpp, B.cpp et Z.cpp contiennent juste l'inclusion de leur header.

    Donc en fait on tourne un peu en rond dans tout ça. Lors de la compilation j'obtiens le message : expected class-name before '{' token sur la ligne 6 de mon B.h.

    Je voudrais juste savoir si c'est possible de faire ceci en C++ (et alors comment ?) ou bien il faut que je revois ma modélisation ?

    Merci d'avance.

  2. #2
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 753
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 753
    Points : 10 704
    Points
    10 704
    Billets dans le blog
    3
    Par défaut
    Tu es une dépendance cyclique, il serait bon d'essayer de la supprimer. Mais sinon:
    http://c.developpez.com/faq/cpp/?pag...erence_croisee

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    731
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 731
    Points : 574
    Points
    574
    Par défaut
    C'est normal, si B.cpp est ton premier fichier compilé, ça donne :
    j'inclus A.h
    A_H n'est pas défini donc j'y rentre.
    J'inclus Z.h
    Z_H n'est pas défini donc j'y rentre.
    Et Z.h inclut B.h qui est a déjà défini B_H
    donc il passe directement au prototype de classe qui ne trouve pas la classe A.

  4. #4
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    utilise plutôt que c'est la première fois que je vois cette syntaxe, je ne suis pas sûr qu'elle soit valide

    ensuite, pourquoi avoir mis le corps du constructeur et du destructeur de B dans son .h ? (même si je doute que le problème vienne de là)

    enfin, tes .h s'incluent mutuellement...
    il y a un problème...
    A a besoin de Z qui a besoin de B qui a besoin de A (puisqu'il en hérite)

    on se retrouve avec A a besoin de A... et surtout, très surprenant, A a besoin de B !!!

    es-tu sûr de ne pas avoir fait d'erreur de modélisation ?

    sinon essaie de rajouter dans ton A.h (avant le #ifndef)
    et dans le B.h (avant le #ifndef) etc...

    ça permettra de dire que les classes existent sans pour autant causer de déclaration multiples, mais je pense qu'on va tomber sur un "A non spécifiée complètement"...

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Hé ben en tout cas vous ne perdez pas de temps pour répondre !!

    Citation Envoyé par Swoög
    utilise plutôt que c'est la première fois que je vois cette syntaxe, je ne suis pas sûr qu'elle soit valide
    La synthaxe est correcte. Je sais plus où je l'ai vu mais une bibliothèque l'utilise.

    Citation Envoyé par Swoög
    ensuite, pourquoi avoir mis le corps du constructeur et du destructeur de B dans son .h ? (même si je doute que le problème vienne de là)
    Là c'était juste pour tout mettre dans le même fichier, histoire de simplifier mon post.

    Citation Envoyé par Swoög
    on se retrouve avec A a besoin de A... et surtout, très surprenant, A a besoin de B !!!
    Euh ... non A n'a pas besoin de B.

    Citation Envoyé par Swoög
    es-tu sûr de ne pas avoir fait d'erreur de modélisation ?
    Ben je crois que je vais revoir ça ...

    Citation Envoyé par Swoög
    sinon essaie de rajouter dans ton A.h (avant le #ifndef)
    et dans le B.h (avant le #ifndef) etc...

    ça permettra de dire que les classes existent sans pour autant causer de déclaration multiples, mais je pense qu'on va tomber sur un "A non spécifiée complètement"...
    Non ça déconne : invalid use of undefined type `struct A' et forward declaration of `struct A'.

    Bon merci bien. Je crois que je vais tout simplement revoir ma modélisation !!

  6. #6
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Citation Envoyé par Jloox
    Euh ... non A n'a pas besoin de B.
    A a besoin de Z qui a besoin de B !!
    donc A a besoin de B... la dépendance est transitive...$

    Citation Envoyé par Jloox
    Non ça déconne : invalid use of undefined type `struct A' et forward declaration of `struct A'.

    Bon merci bien. Je crois que je vais tout simplement revoir ma modélisation !!
    oé me suis planté, je voulais dire ce dont a parlé Aurelien...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/04/2010, 09h42
  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. expected primary-expression before '=' token
    Par steph_p dans le forum Débuter
    Réponses: 4
    Dernier message: 02/02/2009, 16h03
  5. erreur: expected class-name before «{"
    Par mansour67 dans le forum wxWidgets
    Réponses: 7
    Dernier message: 08/04/2008, 18h57

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