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 :

Méthode d'affichage et prob de const


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Points : 43
    Points
    43
    Par défaut Méthode d'affichage et prob de const
    Bonjour tout le monde,

    J'ai un petit problème concernant ma méthode d'affichage.
    Cette méthode contient la définition suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Recette::afficher_mieux(std::ostream& os) const{
    J'aimerais savoir s'il est possible dans le corps de cette fonction d'appeler une autre fonction modifiant une variable locale de celle-ci ?

    Exemple : dans le corps j'ai ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      modifSousRecette(ingredients,(*it).first,(*it).second,1.00);
    Le compilateur me sort :
    103 passing `const Recette' as `this' argument of `void Recette::modifSousRecette(string_double_map&, Ingredient*, Quantite*, double)' discards qualifiers
    Cette erreur est-elle due au mot clé const ? Comment faire pour résoudre ca ?

    Merci d'avance

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Bonjour,
    Oui, mais ce n'est pas une erreur.
    T'as fonction est const, elle ne doit donc pas modifier la class pendant l'appel. A part les variable mutable, si je ne me trompe pas.
    Pourquoi l'affichage devrait modifier t'as class??

  3. #3
    Membre du Club
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Points : 43
    Points
    43
    Par défaut
    Cet affichage doit récuperer par exemple les matieres premieres. Cette classe contient une map d'ingredient (classe mere de Recette et Matiere) et de Quantite.

    Lors de l'appel de cette fonction d'affichage je souhaitais créer une map temporaire de <string,double> (variable locale appelée ingredients) que j'allais modifier gràce à l'appel de la fonciton récursive :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    modifSousRecette(ingredients,(*it).first,(*it).second,1.00);
    Et après l'appel je n'aurais plus qu'a afficher ce que contient la map.

    Comment faire ?

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par allserv Voir le message
    Lors de l'appel de cette fonction d'affichage je souhaitais créer une map temporaire de <string,double> (variable locale appelée ingredients)
    Tout compte fait t'as choisi une map alors .
    Sinon une variable local à la fonction y as pas de problème, tu peut la modifier. Pour faire ce que tu veut il faudrait que it soit un const_iterator et que
    modifSousRecette soit const aussi.
    Peut tu montrer le code de cette fonction?

  5. #5
    Membre du Club
    Profil pro
    Developpeur
    Inscrit en
    Septembre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Septembre 2004
    Messages : 114
    Points : 43
    Points
    43
    Par défaut
    Ah d'accord, je viens de mettre const à ma fonction recurisve et du coup je n'ai plus cette erreur.
    En fait je pensais que le mot clé const en fin de déclaration de méthode disait qu'aucun argument n'allait être modifié et en fait ca joue seulement sur les attributs de la classe.

    Merci de ton aide

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par allserv Voir le message
    Ah d'accord, je viens de mettre const à ma fonction recurisve et du coup je n'ai plus cette erreur.
    En fait je pensais que le mot clé const en fin de déclaration de méthode disait qu'aucun argument n'allait être modifié et en fait ca joue seulement sur les attributs de la classe.

    Merci de ton aide
    A ce que j'ai compris oui. Et ca t'empêche aussi d'appeler des fonctions non const de ta class.
    Je t'avoue que je ne suis pas encore à l'aise avec les const non plus. Mais ça permet de bien structurer tes class.

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

    Informations professionnelles :
    Activité : aucun

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

    Les trois possibilités d'usage du mot clé const sont:
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      const type LaClasse::laFonction()
      Tu t'engage à ne pas essayer de modifier l'élément renvoyé par cette fonction (parce que c'est un pointeur, par exemple)
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      type LaClasse::laFonction(const typearg argument)
      tu t'engage à ne pas modifier l'argument fournit, si c'est une référence, tu évite également la recopie
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      type LaClasse::laFonction() const
      tu t'engage à ce que la fonction ne modifie rien: ni les éventuels arguments fournits, ni les membres de la classe...
      Cela implique que tu dois utiliser des const_iterator pour accéder aux conteneurs, et que tu ne peux pas appeler d'autres méthodes non const
      Par contre, rien ne t'empeche de créer des variables temporaires que tu peux tenter de modifier... quant à voir si c'est opportun...


    Ensuite, viennent les variantes tirées de ces trois possibilités

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    merci
    par contre
    Citation Envoyé par koala01 Voir le message
    Salut,
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      type LaClasse::laFonction() const
      tu t'engage à ce que la fonction ne modifie rien: ni les éventuels arguments fournits, ni les membres de la classe...
      Cela implique que tu dois utiliser des const_iterator pour accéder aux conteneurs, et que tu ne peux pas appeler d'autres méthodes non const
      Par contre, rien ne t'empeche de créer des variables temporaires que tu peux tenter de modifier... quant à voir si c'est opportun...
    tu es sur ??

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Points : 108
    Points
    108
    Par défaut
    ni les éventuels arguments fournits
    Non, du moment que ces arguments ne sont pas const, on peut toujours les modifier.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Une façon de voir les choses qui peut aider à s'en souvenir (ou pas, ça dépend des gens), c'est de dire que dans une fonction membre non const d'une classe A, this est de type A*, alors que dans une fonction const, this est de type A const *.

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Petite question,
    A const * , const A * c'est bien la même chose?? ou la position de const modifie sa signification?

  12. #12
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Vi, A const * et const A * sont équivalents. Ils sont différents de A* const.

    La règle veut que const s'applique à l'élément placé juste devant, sauf s'il est au début, auquel cas il s'applique à l'élément placé après. Je préfère me mettre dans le cas de la règle générale que dans l'exception, et donc écrire A const *.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Là, c'est la même chose.
    C'est A * const qui est différent.

    Et quand on combine les deux, const A * const et A const * const reviennent au même.

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Là, c'est la même chose.
    C'est A * const qui est différent.

    Et quand on combine les deux, const A * const et A const * const reviennent au même.
    ok merci.
    C'est quoi la différence?

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par Biozic Voir le message
    Non, du moment que ces arguments ne sont pas const, on peut toujours les modifier.
    Mais d'un autre coté, cela me choque énormément qu'une méthode déclarée constante se mette à modifier des valeurs... fussent celle d'arguments non const passés en paramètre...

    De là à dire que je préférerais ne fournir que des paramètres constants à une méthode constante, il n'y a qu'un pas

    Je suis peut etre un peu obtu sur ce coup là, mais, selon moi, une méthode constante sert à obtenir un acces en "lecture seule", et il n'y a donc, a priori (mais bon, on peut en débattre, n'est-ce pas ), aucune raison qu'elle n'aille modifier quoi que ce soit de manière permanente (ce qui est un risque majeur si tu fournis des paramètres non constants... principalement s'il s'agit de pointeurs ou de références )

  16. #16
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par koala01 Voir le message
    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      type LaClasse::laFonction() const
      tu t'engage à ce que la fonction ne modifie rien: ni les éventuels arguments fournits, ni les membres de la classe...
      Cela implique que tu dois utiliser des const_iterator pour accéder aux conteneurs, et que tu ne peux pas appeler d'autres méthodes non const
      Par contre, rien ne t'empeche de créer des variables temporaires que tu peux tenter de modifier... quant à voir si c'est opportun...
    Il y a quand meme une exception.

    Les donnees membres d'une classe declarees comme mutable peuvent etre modifiees dans des methodes declarees const.

    Cette possibilite n'est toutefois qu'a utiliser que dans des cas tres precis et justifies.
    L'exemple le plus courant est un compteur d'acces que l'on veut pouvoir incrementer lors de l'acces a des methodes de type Get().

  17. #17
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Jack_serious Voir le message
    L'exemple le plus courant est un compteur d'acces que l'on veut pouvoir incrementer lors de l'acces a des methodes de type Get().
    Plus encore qu'un compteur d'accès, qui est souvent plus une technique de débug que de vrai code, implémenter un cache servant à précalculer un résultat long est typique de l'utilisation de mutable.

  18. #18
    Membre averti Avatar de Jack_serious
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    350
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 350
    Points : 396
    Points
    396
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Plus encore qu'un compteur d'accès, qui est souvent plus une technique de débug que de vrai code, implémenter un cache servant à précalculer un résultat long est typique de l'utilisation de mutable.
    La ca m'interesse. Tu pourrais detailler et donner un exemple s'il te plait ?

  19. #19
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais d'un autre coté, cela me choque énormément qu'une méthode déclarée constante se mette à modifier des valeurs... fussent celle d'arguments non const passés en paramètre...
    Il y a des cas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Note
    {
    public:
      bool estDansLeTop10(vector<int> autresNotes) const;
    };
    Pour calculer le top10, il va falloir trier le tableau, donc le modifier. Il n'empêche que ça ne modifie en rien la note testée...
    L'alternative est de passer le tableau par référence constante, et de créer une copie locale du tableau que l'on triera, mais bon, c'est plus lourd d'écriture.

    Un autre cas, bien plus courant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Affiche(std::ostream &) const;
    Heureusement que j'ai le droit de modifier mon stream...

  20. #20
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Jack_serious Voir le message
    La ca m'interesse. Tu pourrais detailler et donner un exemple s'il te plait ?
    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
    class Eleve
    {
    public:
      double moyenne() const;
    private:
      double calculerMoyenne() const;
      mutable bool maMoyenneEstAJour;
      mutable double maMoyenne;
      vector<double> mesNotes;
    };
     
    double Eleve::moyenne() const
    {
      if (!maMoyenneEstAJour)
      {
        maMoyenne = calculerMoyenne();
        maMoyenneEstAJour = true;
      }
      return maMoyenne;
    }

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. problème méthode d'affichage
    Par layfon dans le forum JSF
    Réponses: 20
    Dernier message: 27/02/2015, 17h05
  2. [1.x] Meilleur méthode pour affichage libellé au lieu de l'id
    Par Bizoo dans le forum Symfony
    Réponses: 10
    Dernier message: 06/01/2011, 16h48
  3. Différentes méthodes d'affichage d'un bitmap
    Par atomicJo dans le forum MFC
    Réponses: 5
    Dernier message: 07/02/2008, 19h06
  4. Méthode d'affichage avec MFC
    Par Blobette dans le forum MFC
    Réponses: 2
    Dernier message: 09/03/2005, 16h48
  5. Prob d'affichage d'un tableau resultant d'u...
    Par Yohips dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 08/12/2004, 17h23

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