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 :

Expected class-name before {


Sujet :

C++

  1. #1
    Invité4
    Invité(e)
    Par défaut Expected class-name before {
    Bonjour,

    je code un petit programme avec CodeBlocks.
    En compilant, j'ai cette erreur étrange :
    Projet C++\AntSimulator\NormalCell.h|8|error: expected class-name before '{' token|
    Code : 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
    22
    23
    24
    25
    26
    #ifndef NCELL_H_INCLUDED
    #define NCELL_H_INCLUDED
     
    #include "Utilities.h"
    #include "Cell.h"
    #include "Definitions.h"
     
    class NormalCell : protected Cell
    { // <---- Erreur survient ici
        public:
        virtual ~NormalCell();
        int getFoodQuantity() const;
        void setFoodQuantity(int);
        int getFoodQuality() const;
        void setFoodQuality(int);
        void removeOneFood();
        virtual bool isWalkable();
        virtual CellType getType() const;
        virtual bool isNormal();
     
        private:
        uint FoodQuality;
        uint FoodQuantity;
    };
     
    #endif
    Savez-vous ce que c'est ?
    Merci, meilleures salutations.
    Dernière modification par 3DArchi ; 21/05/2011 à 10h03.

  2. #2
    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
    Bonjour,
    A priori je dirais qu'il ne reconnaît pas Cell. A quoi ressemble "Cell.h" ?

  3. #3
    Invité4
    Invité(e)
    Par défaut
    Merci,
    effectivement, car plus bas, j'ai une autre erreur "Cell does not name a type."

    Voici Cell.h
    Code : 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
    22
    23
    24
    25
    26
    27
    28
    #ifndef CELL_H_INCLUDED
    #define CELL_H_INCLUDED
     
    #include "Definitions.h"
    #include "Utilities.h"
    #include "Application.h"
     
    class Cell
    {
        public:
        Cell();
        ~Cell();
     
        void dropPheromon(double);
        double getPheromon(void) const;
        void setPheromon(double);
     
        virtual bool isWalkable(void);
        virtual CellType getType(void) const;
        virtual bool isNormal(void);
     
        protected:
        double PheromonQuantity;
        int pheromonThreshold;
        Configure config;
    };
     
    #endif // CELL_H_INCLUDED

  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,
    Je ne vois pas... A moins que tu aies une inclusion récursive cachée (dans "Application.h" ?) A quoi ressemblent "Application.h", "Utilities.h" et "Definitions.h" ?

  5. #5
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 218
    Points
    1 218
    Par défaut
    à titre indicatif, que se passe-t'il si tu n'inclus que "Cell.h" dans "NormalCell.h" ?

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 265
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 265
    Points : 6 686
    Points
    6 686
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    A moins que tu aies une inclusion récursive cachée
    Ça me parait effectivement le plus probable.
    De façon générale, il faut éviter autant que possible les #include dans des en-tête, quitte à utiliser, si besoin, des prédéclations. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef B_H
    #define B_H
     
    class A; // pré déclaration de A
     
    class B
    {
    //...
        A* a; // utilisation d'un pointeur sur A. A.h devra être inclus dans B.cpp
    };
     
    #endif

  7. #7
    Invité4
    Invité(e)
    Par défaut
    Citation Envoyé par méphistopheles Voir le message
    à titre indicatif, que se passe-t'il si tu n'inclus que "Cell.h" dans "NormalCell.h" ?
    Même problème




    Citation Envoyé par 3DArchi Voir le message
    Salut,
    Je ne vois pas... A moins que tu aies une inclusion récursive cachée (dans "Application.h" ?) A quoi ressemblent "Application.h", "Utilities.h" et "Definitions.h" ?
    Code : 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
    22
    23
    24
    25
    26
    #ifndef APPLICATION_H_INCLUDED
    #define APPLICATION_H_INCLUDED
     
    #include "Utilities.h"
    #include "Engine.h"
    #include "world.h"
     
    int main(int argc, char **argv);
     
    class Application
    {
        public:
        Application(string configfile);
        bool run(void);
        static string getConfigFile(void);
     
        private:
        Engine engine;
        Configure config;
        uint elapsedTime; // en secondes
        World environment;
        static string configFile;
     
    };
     
    #endif // APPLICATION_H_INCLUDED
    Code : 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    #ifndef UTILITIES_H_INCLUDED
    #define UTILITIES_H_INCLUDED
     
    #ifdef WIN32
        #include <Windows.h>
    #else
        #include <unistd.h>
    #endif
    using namespace std;
    typedef unsigned int uint;
     
    #include <string>
    #include <vector>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <queue>
     
    /* Configure
        Lit un fichier de configuration.
        Chaque paramètre est situé sur une ligne
        : sépare le paramètre de sa valeur
        Exemple
            size:17
        Les commentaires sont autorisés et sont précédés de deux backslashes //
        Exemple
            // Taille
            size:17
     
            // Auteur
            author:Benjamin
    */
     
    void pSleep(uint ms);
     
    class Configure
    {
        public:
        // Constructeur
        void load(string file);
        string getParameterValue(string parameter);
        int getiParameterValue(string parameter);
        string getConfFile(void);
     
        private:
        ifstream filestream;
        vector<string> Parameters;
        vector<string> Values;
        string conffile;
     
    };
     
    /* Vec2i
        Classe permettant un vecteur de type int à deux dimensions
    */
    class Vec2i
    {
        public:
        Vec2i(int sx, int sy);
        int getX(void);
        int getY(void);
        void setX(int& sx);
        void setY(int& sy);
        void set(int& sx, int& sy);
     
        private:
        int x, y;
    };
     
     
    #endif // UTILITIES_H_INCLUDED
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef DEFINITONS_H_INCLUDED
    #define DEFINITONS_H_INCLUDED
     
    typedef unsigned short int CellType;
     
    #define Cell_Undefined 0
    #define Cell_Normal 1
     
     
     
     
    #endif // DEFINITONS_H_INCLUDED

  8. #8
    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
    On risque de remonter tout ton spaghetti d'include As-tu vérifié que tu n'avais pas une boucle dans les inclusions ?

    Quelques remarques :
    1/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int main(int argc, char **argv);
    Tu appelles main depuis une de tes fonctions ? Comme je ne le pense pas, tu n'as pas besoin de déclarer main. Sinon, ???
    2/
    Code trucmuche.h : Sélectionner tout - Visualiser dans une fenêtre à part
    using namespace std;
    dans un .h : c'est

    3/Vec2i == std::pair<int,int> ?

    4/ void pSleep(uint ms); : bizarre ...

  9. #9
    Invité4
    Invité(e)
    Par défaut
    Ouais pour le main, c'est effectivement inutile.
    Pour le Vec2i, on nous le demande pour le projet, c'est vrai que c'est débile vu que pair existe.

    Autrement pour éviter une boucle d'includes ?
    Il y a ifndef, ça suffit, non ?

  10. #10
    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
    Citation Envoyé par Eldacar Voir le message
    Ouais pour le main, c'est effectivement inutile.
    Pour le Vec2i, on nous le demande pour le projet, c'est vrai que c'est débile vu que pair existe.

    Autrement pour éviter une boucle d'includes ?
    Il y a ifndef, ça suffit, non ?
    Non, si tu fais :
    A.h
    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 "B.h"
     
    class A
    {
       public :
       void Fonction(B&);
    };
    #endif
    et
    B.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifndef B_H
    #define B_H
    #include "A.h"
     
    class B
    {
       public :
       void Fonction(A&);
    };
    #endif
    Puis A.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include "A.h" 
    // ...
    Tu te fais jeter par le compilo car il ne connais pas A:
    1/ A.cpp : include "A.H"
    2/ A_H non défini -> on le défini
    3/ dans a.h la première ligne : include "B.h"
    4/ B_H non défini -> on le défini
    5/ dans b.h, la première ligne est include "a.h"
    6/ A_H déjà défini, rien n'est inclu.
    7/ On arrive à void Fonction(A&); -> "error: expected class-name before '&' token"

    Ca se contourne de 2 façons :
    1/ En vérifiant dans sa conception toute les boucles pour voir si elles sont bien normales et ne relèvent pas d'une conception bancale,
    2/ En déclarant au lieu d'inclure :
    A.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef A_H
    #define A_H
    //#include "B.h"
    class B;
     
    class A
    {
       public :
       void Fonction(B&);
    };
    #endif
    et
    B.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef B_H
    #define B_H
    //#include "A.h"
    class A;
     
    class B
    {
       public :
       void Fonction(A&);
    };
    #endif
    Puis A.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "A.h" 
    #include "B.h" 
    // ...

  11. #11
    Invité4
    Invité(e)
    Par défaut
    ça fonctionne,

    merci beaucoup.

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. erreur: expected class-name before «{"
    Par mansour67 dans le forum wxWidgets
    Réponses: 7
    Dernier message: 08/04/2008, 18h57
  4. Réponses: 5
    Dernier message: 05/05/2006, 18h07
  5. Class Name
    Par socrate dans le forum MFC
    Réponses: 5
    Dernier message: 22/05/2005, 18h20

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