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 :

Paramètres de méthodes 'const'


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Points : 33
    Points
    33
    Par défaut Paramètres de méthodes 'const'
    Bonjour,

    j'ai eu un petit souci avec une méthode. Je l'ai résolu mais je ne comprends pas comment...

    Pour expliquer, voici mon code: (j'ai enlevé les include et tout ça...)

    Dans main.cpp:
    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
     
    void displayObj(const vector<myObject> &theObjects);
     
    int main()
    {
        ...
    }
     
    void displayObj(const vector<myObject> &theObjects)
    {
        for(unsigned int i(0); i < theObjects.size(); i++)
        {
            theObjects[i].afficher();
        }
    }
    Dans myObject.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void myObject::afficher()
    {
        cout << "Nom : " << m_nom << ", Age : " << m_age << endl;
    }
    Dans cette configuration là mon code ne compile pas. L'erreur est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    error: passing 'const Arme' as 'this' argument of 'void myObject::afficher()' discards qualifiers
    Et lorsque j'enlève le 'const' en paramètre de ma fonction displayObj, là je n'ai plus de problèmes! Mais je ne comprends pas pourquoi...

    Si certains ont une explication, merci

  2. #2
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Il faut que tu déclare ta méthode myObject::afficher() const. Par défault, les méthodes sont non-const.

    En l'occurence, tu dis à ton compilateur, j'ai une liste d'objet que je n'ai pas le droit de modifier, et je vais appliquer dessus la méthode afficher() qui va potentiellement modifier cet objet (le compilateur ne fait pas d'analyse poussée de ce que fait réellement ta fonction) donc il t'envoie ballader .

  3. #3
    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 De l'importance d'être constant
    Entre deux choix possibles, l'incompréhension conduit au mauvais
    dsl

    const accolé à une variable indique au compilateur que cette variable ne va pas être modifiée dans le scope où elle se trouve : pour un paramètre cela veut dire que le paramètre ne va pas être modifié : tu ne peux lui affecter une nouvelle valeur ou tu ne peux appeler que des fonctions constantes sur cet objet. Gérer la constance est important, cf ici et suivant.

    Donc ta modif aurait du être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void myObject::afficher() const
    et laisser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void displayObj(const vector<myObject> &theObjects);

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    55
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 55
    Points : 33
    Points
    33
    Par défaut
    Ok merci pour vos informations.

    Je ne savais pas qu'il fallait aussi déclarer la fonction 'const' !!

    Merci encore

  5. #5
    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,
    Citation Envoyé par pacolito Voir le message
    Ok merci pour vos informations.

    Je ne savais pas qu'il fallait aussi déclarer la fonction 'const' !!

    Merci encore
    En fait cela rentre dans un contexte assez particulier que l'on appelle "const correctness" (la correction par rapport à la constance).

    Comme l'a fait remarquer zul, les fonctions membres de classes ne sont, par défaut, pas constantes.

    Cela signifie qu'elles ne s'engagent absolument pas à ne pas modifier l'objet en cours d'utilisation.

    Le problème vient du fait que tu déclare explicitement theObjects comme... un objet constant.

    Or, si tu modifie l'un des élément de theObjects, tu modifie fatalement theObjects, ce que le compilateur ne veut pas accepter, et pour cause: tu t'es engagé à ne pas modifier theObjects en le déclarant constant.

    La règle est, en effet, relativement simple: on peut invoquer n'importe quelle fonction (qu'elle se soit engagée à ne pas modifier l'objet en cours ou non) au départ d'un objet non constant, par contre, on ne peut invoquer de des fonctions qui se seront engagées à ne pas modifier l'objet courent au départ... d'un objet qui ne peut pas être modifié.

    Une "saine pratique" à adopter consiste donc:
    1. à utiliser des objets constants chaque fois qu'ils ne faut pas qu'ils soient modifiés
    2. à déclarer explicitement toute fonction qui ne modifiera pas l'objet comme étant constante
    De cette manière, tu sera certain que les seuls endroits où ton objet est modifié sont... ceux où tu accepte que ce soit le cas
    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

Discussions similaires

  1. Valeur par défaut des paramètres d’une méthode
    Par three minute hero dans le forum BOUML
    Réponses: 6
    Dernier message: 29/06/2008, 23h04
  2. Action - passage de paramètres à une méthode
    Par burhud dans le forum Struts 2
    Réponses: 3
    Dernier message: 16/10/2007, 10h12
  3. [Artichow] Courbe et paramètre par méthode Get
    Par Papy_Guik dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 09/10/2007, 22h39
  4. Réponses: 7
    Dernier message: 30/08/2007, 14h17
  5. Déclaration d'un paramètre de méthode en final ?
    Par elitost dans le forum Langage
    Réponses: 1
    Dernier message: 22/09/2005, 09h10

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