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 :

Mon code est incorrect ?


Sujet :

C++

  1. #1
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut Mon code est incorrect ?
    Bonsoir
    J'ai fais un code qui permet de calculer le perimetre d'un rectangle
    Mais lors de la compilation ya une erreur "expected unqualified-id expected before ')' (ligne 5)

    j'arrive pas à savoir où est le pb???
    Images attachées Images attachées  

  2. #2
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Tu as mis des parenthèses au nom de la classe, ce n'est pas permis, seul les fonctions peuvent en avoir.

  3. #3
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Tu as mis des parenthèses au nom de la classe, ce n'est pas permis, seul les fonctions peuvent en avoir.
    je viens d'enlever les parenthèses et voilà les erreurs qu'on m'affiche
    Images attachées Images attachées  

  4. #4
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Tu as oublié un ; après la } de la définition de ta classe.

  5. #5
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par Flob90 Voir le message
    Tu as oublié un ; après la } de la définition de ta classe.
    Voilà merci !! ça marche maintenant

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Heuu, à vrai dire, je serais vraiment étonné que, tel quel, ton code fonctionne parce que, en dehors de toute précision contraire (ce qui est le cas tel que tu nous le présente ), les membres et fonctions membres d'une classe ont une accessibilité par défaut à private, et ne sont donc accessibles qu'aux fonctions membres de la classe elle-même!!!

    De plus, on préfère éviter le recours à des fonctions de type "init", parce que l'on préfère utiliser un mécanisme nommé "RAII" (Ressource Aquizition Is Initialization) en implémentant une fonciton particulière qui sera d'office appelée lorsque l'on crée une nouvelle instance de la classe et qui s'appelle le "constructeur".

    Ainsi, ta classe Rectangle devrait plutôt ressembler à quelque chose comme
    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
    class Rectangle
    {
        public: // si on ne ne le précise pas, tout est dans la visibilité private,
                // et la classe devient inutilisable
     
            /* le constructeur, prend les deux valeurs qui nous intéressent à
             * savoir la longueur et la largeur
             */
            Rectangle(float longueur, float largueur):
                      long(longueur),larg(largeur) // ceci s'appelle une liste d'initialisation
            {
            }
            float perimetre()  const /* précise que cette fonction s'engage à ne 
                                      * pas modifier l'objet au départ duquel elle est appelée
                                      * Cela participe au respect de la "const-correctness"
                                      */
            {
                 return (long+larg)*2;
            }
            void affich() const /* idem */
            {
                std::cout<<"longueur :"<<long<<std::endl
                         <<"largeur  : "<<larg<< std::endl
                         <<"perimetre : "<<perimetr()<<std::endl;
            }
        private:
            float long;
            float larg;
    };
    et son utilisation deviendrait alors proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        rectangle r(2,3);
        r.affich();
        return 0;
    }
    Le principe que l'on appelle "const-correctness" conseille, tout simplement, de préciser qu'une fonction qui ne modifie pas l'objet en cours (comme c'est le cas de perimetre() et de affiche(), mais comme ce n'était pas le cas de ta fonction init() )s'engage à... ne pas modifier l'objet en question.

    Cela a son importance pour la simple et bonne raison que l'on va parfois devoir travailler avec des objets "constants" (des objets dont on ne veut absolument pas qu'ils soient modifiés durant le traitement qu'ils subissent), et que, dans de telles conditions, seules les fonctions qui se seront engagées à ne pas modifier les objet pourront être appelées.

    Dans de telles circonstances, tu pourras danser sur ta tête, le compilateur sera décidément beaucoup plus buté que toi, et refusera purement et simplement que tu tentes d'utiliser une fonction non constante depuis un objet constant

    Finalement, le fait de déclarer constant tout ce qui n'a pas vocation à être modifié ou à modifier l'objet au départ duquel la fonction est appelée t'évitera bien des soucis suite à des modifications involontaires, appliquées par des fonctions qui seraient appelées par une fonction à laquelle tu aurais recours
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Heuu, à vrai dire, je serais vraiment étonné que, tel quel, ton code fonctionne parce que, en dehors de toute précision contraire (ce qui est le cas tel que tu nous le présente ), les membres et fonctions membres d'une classe ont une accessibilité par défaut à private, et ne sont donc accessibles qu'aux fonctions membres de la classe elle-même!!!

    De plus, on préfère éviter le recours à des fonctions de type "init", parce que l'on préfère utiliser un mécanisme nommé "RAII" (Ressource Aquizition Is Initialization) en implémentant une fonciton particulière qui sera d'office appelée lorsque l'on crée une nouvelle instance de la classe et qui s'appelle le "constructeur".

    Ainsi, ta classe Rectangle devrait plutôt ressembler à quelque chose comme
    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
    class Rectangle
    {
        public: // si on ne ne le précise pas, tout est dans la visibilité private,
                // et la classe devient inutilisable
     
            /* le constructeur, prend les deux valeurs qui nous intéressent à
             * savoir la longueur et la largeur
             */
            Rectangle(float longueur, float largueur):
                      long(longueur),larg(largeur) // ceci s'appelle une liste d'initialisation
            {
            }
            float perimetre()  const /* précise que cette fonction s'engage à ne 
                                      * pas modifier l'objet au départ duquel elle est appelée
                                      * Cela participe au respect de la "const-correctness"
                                      */
            {
                 return (long+larg)*2;
            }
            void affich() const /* idem */
            {
                std::cout<<"longueur :"<<long<<std::endl
                         <<"largeur  : "<<larg<< std::endl
                         <<"perimetre : "<<perimetr()<<std::endl;
            }
        private:
            float long;
            float larg;
    };
    et son utilisation deviendrait alors proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        rectangle r(2,3);
        r.affich();
        return 0;
    }
    Le principe que l'on appelle "const-correctness" conseille, tout simplement, de préciser qu'une fonction qui ne modifie pas l'objet en cours (comme c'est le cas de perimetre() et de affiche(), mais comme ce n'était pas le cas de ta fonction init() )s'engage à... ne pas modifier l'objet en question.

    Cela a son importance pour la simple et bonne raison que l'on va parfois devoir travailler avec des objets "constants" (des objets dont on ne veut absolument pas qu'ils soient modifiés durant le traitement qu'ils subissent), et que, dans de telles conditions, seules les fonctions qui se seront engagées à ne pas modifier les objet pourront être appelées.

    Dans de telles circonstances, tu pourras danser sur ta tête, le compilateur sera décidément beaucoup plus buté que toi, et refusera purement et simplement que tu tentes d'utiliser une fonction non constante depuis un objet constant

    Finalement, le fait de déclarer constant tout ce qui n'a pas vocation à être modifié ou à modifier l'objet au départ duquel la fonction est appelée t'évitera bien des soucis suite à des modifications involontaires, appliquées par des fonctions qui seraient appelées par une fonction à laquelle tu aurais recours
    J'ai pas bien compris ce que vous avez dis étant donné que je suis débutante!
    Sinon ce code marche très bien parait-il , on l'as écris en classe avec notre prof donc ça sera bizarre que ça soit faux?

  8. #8
    Membre régulier
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 183
    Points : 78
    Points
    78
    Par défaut
    Autre question : comment vous faites pour faire une capturer de votre code ainsi ??

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Au temps pour moi, je n'avait pas vu la ligne public:

    Ceci dit, mes remarques concernant le recours à des fonctions "init" et la const-correctness restent tout à fait valables

    J'aurais tendance à dire que ton prof fait plus du "C with classes" que du C++

    Si j'étais méchant, je pourrais facilement dire que ton prof aurait besoin d'une sérieuse remise à plat de ses connaissances en C++ (même s'il est peut etre très compétant en C au demeurant )

    Ce qui est vrai aussi, c'est que l'on a l'habitude (mais bon, ce n'est qu'une haibtude, hein ) de voir l'interface publique en haut de la définition de la classe, et, souvent, de laisser un espace vide entre ce qui précède les informations de visibilité ( public:, protected:, private: et ce genre d'information...

    Cela ne mange pas de pain de laisser une ligne vide, mais cela permet d'éviter les cas comme celui auquel on est confronté : une lecture un peu trop rapide a fait que je n'ai, en toute bonne foi, simplement pas vu que le mot clé public: était bel et bien présent

    Il est bon de garder en mémoire qu'un code source sera beaucoup plus souvent lu ou étudié qu'il ne sera compilé

    Avant même de penser à faire un code correct, il est donc important à faire en sorte que le code reste lisible aisément par l'humain, cela évite énormément de méprises
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par nourhene4 Voir le message
    Autre question : comment vous faites pour faire une capturer de votre code ainsi ??
    On utilise la balise
    [ CODE ] Le code ici [ / CODE ] (sans les espaces que je n'ai mis que pour éviter que les balises ne soient interprétées )

    C'est le bouton # au dessus du formulaire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [Dates] Le résultat de mon code est inexact
    Par bebas dans le forum Langage
    Réponses: 1
    Dernier message: 27/02/2007, 10h50
  2. Réponses: 1
    Dernier message: 08/02/2007, 09h11
  3. Pourquoi mon code est plus lent que Arrays.sort
    Par alexis779 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/12/2006, 12h44
  4. [Tableaux] Mon code est bon ?
    Par garaut dans le forum Langage
    Réponses: 8
    Dernier message: 14/11/2006, 15h47
  5. [Dates] calcul de date est ce que mon code est bon?
    Par carmen256 dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2006, 11h30

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