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 :

Pourquoi ces erreurs


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 112
    Par défaut Pourquoi ces erreurs
    Bonsoir tout le monde,
    Je suis en train de programmer un petit jeu de Puissance 4 en C++ sous CodeBlocks avec MinGW comme compileur et j'ai des erreurs de compilation lors de ma déclaration de classe.
    Donc en fait, j'ai fait une classe générique joueur voici le .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
    29
    #ifndef JOUEUR_H_INCLUDED
    #define JOUEUR_H_INCLUDED
    #define NB_PION 21
     
    #include<stdio.h>
     
    #include "Jeu.h"
     
    class Joueur
    {
        public:
            Joueur(void);
            Joueur(char* coul);
            virtual ~Joueur();
            virtual int jouer();
     
            char* getCouleur() { return couleur;}
            void setCouleur(char* coul) {couleur = coul;}
            int getNbPion() {return nbPion;}
     
        protected:
            int nbPion;
            char* couleur;
    };
     
     
     
     
    #endif // JOUEUR_H_INCLUDED
    Et des classe qui l'hérite, JoueurHumain et JoueurOrdi (ici JoueurHumain):

    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
    #ifndef JOUEURHUMAIN_H_INCLUDED
    #define JOUEURHUMAIN_H_INCLUDED
     
    #include "Joueur.h"
     
    class JoueurHumain : public Joueur
    {
        public:
            JoueurHumain();
            JoueurHumain(char* coul);
            ~JoueurHumain();
            int jouer();
     
    };
     
    #endif // JOUEURHUMAIN_H_INCLUDED
    Je ne crois pas qu'il y' ait d'erreur dans mon code, a moins que je sois bigleu ou que je ne sais vraiment plus faire du C++... Pourtant, GCC m'affiche cette erreur à la compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: expected class-name before '{' token
    L'erreur est indiquée à la ligne juste en dessous la déclaration de ma classe JoueurHumain. Je vois vraiment pas pourquoi il me dit qu'il manque une accolade...
    Bref, c'est peut-être parceque je programme plus trop ces dernier temps mais je comprend vraiment pas la, si quelqu'un à une idée???

    Merci d'avance,
    A+
    Dede

  2. #2
    Sub
    Sub est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2003
    Messages : 20
    Par défaut
    Bonsoir.

    A première vue, et malgré mon grand manque d'expérience, il ne semble pas y avoir d'erreur dans le code présenté ici. En tout cas il compile avec MingW sous Code::Blocks.

    Peut-être l'erreur se trouve-t-elle dans "Jeu.h" ?

    Sinon, une petite remarque qui n'a rien à voir mais stdio.h c'est pas très C++
    Si vous tenez à utilisez les fonctions de la bibliothèque C utilisez <cstdio> qui redéfinit les fonctions de stdio.h à la sauce C++. Et plus généralement vous pouvez utilisez les bibliothèques standard du C en préfixant leur nom d'un 'c' et en supprimant le '.h'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include <cstdio>
    #include <cmath>
    etc

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 308
    Par défaut
    Des énormes maladresses dans la gestion des chaine -- le genre qui provoquera une erreur (la FAQ est ton amie).
    Mais rien qui me semble justifier une erreur de compil. Il nous manque des billes.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    C'est probablement une erreur dans un autre fichier d'inclusion.
    Sinon, ça n'a rien à voir avec ton problème mais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include <string>
    ...
    using namespace std;
    ...
    string couleur;
    ça fait tout de suite plus C++, et tu sentiras très vite l'amélioration dans la facilité d'utilisation.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 112
    Par défaut
    Merci pour vos réponses, je vais chercher dans les autres fichiers d'include...
    Pour le char* c'est qu'en fait on (des gens de ma classe et moi) avait commencé a faire le programme en C et j'ai pas tout convertis en C++.
    De plus, je ne vais plus me servir de chaîne de caractère donc même plus besoin de la STL ou de stdio.

    Bref, même s'il y'a un erreur dans un autre include, je ne comprend pas pourquoi il m'indique une erreur à cette endroit là... Bien que cela fait pas mal de temp que je fais du C++, j'ai toujours l'impression de ne rien y connaître, c'est un langage tellement complexe et complet à la fois...

    Enfin bon... je continus de chercher.

    Merci,

    A+

    dede

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 112
    Par défaut
    Bon... Je devais être bien fatigué hier soir, j'ai pas vu qu'il y'avait un conflit d'include dans mon fichier Jeu.h qui prenait en include Joueur.h et JoueurOrdi.h et JoueurHumain.h... Donc mon problème est résolu!!

  7. #7
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 55
    Par défaut
    Citation Envoyé par Luc Hermitte
    Des énormes maladresses dans la gestion des chaine -- le genre qui provoquera une erreur (la FAQ est ton amie).
    Mais rien qui me semble justifier une erreur de compil. Il nous manque des billes.
    Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void setCouleur(char* coul) {couleur = coul;}
    Ca me donne des frissons dans le dos! Utilise la fonction strcpy!!!!

    JC

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 400
    Par défaut
    Citation Envoyé par jc_isd
    Utilise la fonction strcpy!!!!
    Perdu, en C++, on utilise des std::string.

    Et moi en C, j'aurais utilisé strdup() ou strlen()+malloc()/new[]+strcpy()
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre averti
    Inscrit en
    Décembre 2002
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 55
    Par défaut
    Citation Envoyé par Médinoc
    Perdu, en C++, on utilise des std::string.

    Et moi en C, j'aurais utilisé strdup() ou strlen()+malloc()/new[]+strcpy()
    Salut!

    Je ne suis pas tout a fait d'accord avec toi... Il est vrai que la STL donne un très grand coup de main pour la manipulation de chaine de caracteres (entre autres), que c'est plus clair, propre etc... (et que je l'utilise moi meme egalement)
    Mais dans ce cas précis, ma remarque portait sur le type utilisé par l'utilisateur ( char* ) et des fonctions 'classiques' relatives à ce type (très 'C' je le reconnais, mais que ce soit en C ou en C++, une copie de pointeur n'équivqut pas à une copie de contenu, ca aussi c'est clair).
    Je pense qu'il est nécessaire de réveler les erreurs plutot que de les eluder directement en donnant une autre voie. Car si un jour la personne en question doit (imperativement) utiliser des char* pour une (bonne) raison ou une autre, il sera encore dans le pétrin.
    Attention, je ne dis pas qu'il ne faut pas donner d'autres pistes de solution, mais (au risque de me repeter) seulement apres la justification de l'erreur en elle-meme.

    D'ailleurs c'est finalement un peu ce que tu fais mais à l'envers dans ta réponse.

    Je ne tiens pas a ce que cela parte en troll, mais je tenais à répondre car le "Perdu" a un peu chatouillé mon ego

    A++

    JC

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 400
    Par défaut
    OK.

    D'ailleurs en l'occurence, je me demande si je n'aurais pas simplement utilisé un const char * avec une bète copie du pointeur. Mais généralement dans un objet, une copie du contenu est préférable, on est d'accord.

    J'ai répondu string parce qu'ici, le char* ne se justifiait pas. Cela ressemblait au cas typique du débutant en C++ qui ne connait pas encore string... (surtout que le P.O. inclut <stdio.h> au lieu de <cstdio>)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Cela ressemblait au cas typique du débutant en C++ qui ne connait pas encore string... (surtout que le P.O. inclut <stdio.h> au lieu de <cstdio>)
    Mince... est-ce que je suis un debutant typique en C++?

    Plus serieusement j'utilise systematiquement les formes xxx.h plutot que cxxx qui ne m'ont jamais apporte que des emmerdes; deux exemples: un compilateur comme g++ qui utilise une bibliotheque C externe est incapable de fournir les formes cxxx correctement -- je crois qu'il y arrive avec la collaboration de glibc sous Linux, inutile d'aller verifier dans ce contexte -- et les extensions posix au C sont parfois desactivees avec les formes cxxx meme avec toutes les macros necessaires definies, hors generalement, je les veux.

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 400
    Par défaut
    Mais on n'utilise pas les extensions POSIX en C++
    Le C++ standard, c'est pour faire du code "standard" </sarcasm>

    Évidemment, si l'on veut utiliser l'API C système depuis le C++, on n'a pas trop le choix. Ils devraient faire des headers C++ POSIX pour les plate-formes unixoïdes...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Médinoc
    Évidemment, si l'on veut utiliser l'API C système depuis le C++, on n'a pas trop le choix.
    Il n'y a pas que cela. Le comportement demande pour les formes cxxx est impossible a optenir si on ne controle pas la bibliotheque C egalement. Donc en pratique, cxxx ou xxx.h a souvent le meme comportement, celui demande pour xxx.h. Autant eviter d'utiliser la forme cxxx et introduire de maniere inconnue (parce que ne generant pas une erreur a la compilation) une dependance sur le comportement non standard et utiliser xxx.h qui a a ma connaissance partout le comportement demande (sauf pour les extensions, mais souvent on les veux, ce qui etait le deuxieme point).

    Ils devraient faire des headers C++ POSIX pour les plate-formes unixoïdes...
    Remettons les choses dans l'ordre... le C standard a pris des en-tetes Unix et n'en a standardise qu'une partie. Reprocher apres a Posix d'avoir d'autres choses dedans est un peu bizarre.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2005
    Messages : 112
    Par défaut
    Franchement vous me fait assez rires avec vos débats!!!
    Ca montre bien la complexité d'un langage comme le C++...
    Donc pour info, je ne suis pas un débutant en C++, je l'utilise depuis plusieurs années, mais je n'ai pas commencé avec ce langage, j'ai commencé avec des langage plus objets comme le C# puis après j'ai appris le C pour finir sur du C++ vu que c'est la référence dans le jeu vidéo. Le truc c'est que j'ai fais aussi un peu de java donc vous voyez j'ai un peu de mal avec les "normes" utilisées" pour les langage. Pour ce qui est du char*, croyez moi je sais pertinament que c'est vraiment pas du tout une bonne solution mais exusez moi je trouve que le std::string est pas non plus facile a manipuler comparer au string du java par exemple.

    Enfin bref, de toute façon je n'utilise finalement pas de char* dans mon programme puis c'est vraiment un truc codé a l'arrache et comme je l'ai déjà dis transposé du C...

    Par contre, pour info pourquoi ca vous choc tant ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void setCouleur(char* coul) {couleur = coul;}
    J'ai toujours appris à faire ce genre de chose (enfin peut-être pas avec char* mais bon je l'utilise plus de toute façon).

    Allé A+

    dede

  15. #15
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par dedesite
    Franchement vous me fait assez rires avec vos débats!!!
    Ca montre bien la complexité d'un langage comme le C++...
    Le debat, on en reparlera quand C# aura 25 ans et sera implemente sur autant de plateformes que le C++.

    Donc pour info, je ne suis pas un débutant en C++
    ...
    Par contre, pour info pourquoi ca vous choc tant ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void setCouleur(char* coul) {couleur = coul;}
    Si tu n'es pas capable de repondre a ta question, tu restes un debutant, quel que soit le nombre d'annees de C++ que tu as derriere toi. Les deux premieres questions qui viennent a l'esprit:

    * Pourquoi char* et pas char const*?
    * Quelle est la duree de vie de l'objet pointe par coul? Qu'est-ce qui garanti qu'elle est plus longue que l'objet sur lequel on appelle le membre setCouleur?

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 18/04/2008, 05h33
  2. [C#] Pourquoi une erreur System sur la commande ExecuteReader ?
    Par heavydrinker dans le forum Accès aux données
    Réponses: 4
    Dernier message: 31/07/2006, 17h05
  3. [C#]Pourquoi cette erreur à la suppression d'un repertoire ?
    Par prince_antonio dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/07/2006, 18h47
  4. Pourquoi l'erreur "#Erreur" ?
    Par pyxosledisciple dans le forum Access
    Réponses: 2
    Dernier message: 05/05/2006, 10h24
  5. Pourquoi ces directives #ifndef ... en haut des .h
    Par Patrick PETIT dans le forum C
    Réponses: 8
    Dernier message: 07/03/2003, 00h53

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