Précédent   Forum des professionnels en informatique > C et C++ > C++ > Débuter
Débuter Forum d'entraide pour débuter en langage de programmation C++. Avant de poster : cours d'initiation au C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/01/2012, 19h35   #1
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2012
Messages : 57
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 57
Points : 8
Points : 8
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
Type de fichier : png Capture.PNG (15,9 Ko, 32 affichages)
nourhene4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 19h38   #2
Membre Expert
 
Inscription : août 2004
Messages : 1 202
Détails du profil
Informations forums :
Inscription : août 2004
Messages : 1 202
Points : 1 427
Points : 1 427
Envoyer un message via MSN à Klaim
Tu as mis des parenthèses au nom de la classe, ce n'est pas permis, seul les fonctions peuvent en avoir.
Klaim est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 19h46   #3
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2012
Messages : 57
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 57
Points : 8
Points : 8
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
Type de fichier : png Capture.PNG (8,3 Ko, 15 affichages)
nourhene4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 19h51   #4
Modérateur
 
Avatar de Flob90
 
Homme Florian Blanchet
Etudiant en Optique
Inscription : août 2004
Messages : 789
Détails du profil
Informations personnelles :
Nom : Homme Florian Blanchet
Âge : 21
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Etudiant en Optique

Informations forums :
Inscription : août 2004
Messages : 789
Points : 1 641
Points : 1 641
Tu as oublié un ; après la } de la définition de ta classe.
__________________
"We can solve any problem by introducing an extra level of indirection" Butler Lampson

"N'importe quel problème peut être résolu en introduisant un niveau d'indirection supplémentaire" Butler Lampson (traduction libre)
Flob90 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 19h55   #5
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2012
Messages : 57
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 57
Points : 8
Points : 8
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
nourhene4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 21h50   #6
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 7 426
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 40

Informations forums :
Inscription : octobre 2004
Messages : 7 426
Points : 9 856
Points : 9 856
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
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 :
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 :
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
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
Vous souhaitez contribuer à la rubrique C++ ou Qt contactez-moi par message privé
koala01 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/02/2012, 17h45   #7
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2012
Messages : 57
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 57
Points : 8
Points : 8
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 :
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 :
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?
nourhene4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 17h54   #8
Invité régulier
 
Femme
Étudiant
Inscription : janvier 2012
Messages : 57
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : Tunisie

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : janvier 2012
Messages : 57
Points : 8
Points : 8
Autre question : comment vous faites pour faire une capturer de votre code ainsi ??
nourhene4 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 18h00   #9
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 7 426
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 40

Informations forums :
Inscription : octobre 2004
Messages : 7 426
Points : 9 856
Points : 9 856
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
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
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
Vous souhaitez contribuer à la rubrique C++ ou Qt contactez-moi par message privé
koala01 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 18h53   #10
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 7 426
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 40

Informations forums :
Inscription : octobre 2004
Messages : 7 426
Points : 9 856
Points : 9 856
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
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
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
Vous souhaitez contribuer à la rubrique C++ ou Qt contactez-moi par message privé
koala01 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h30.


 
 
 
 
Partenaires

Hébergement Web