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 :

mot clé const


Sujet :

C++

  1. #1
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut mot clé const
    Bonjour,

    j'ai un soucis avec le mot clé const. J'ai des méthodes de validation qui prennent une autre classe en paramètre. Donc comme d'habitude je met un (const classA& _param) en argument.

    Ensuite j'appelle des méthodes de validation de la classe passée en argument et j'obtiens un joli message d'erreur signifiant qu'il n'y a pas de méthode associé à la classe const.

    Ce que je ne comprend pas c'est que le mot-clé const permet au compilateur d'optimiser, car il sait que la classe ne sera pas modifié. Et je ne fais qu'un get sur un membre.

    Voila un code d'example :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Validator // .h
    {
    	public:
    		Validator();
    		virtual ~Validator();
     
    		bool is_valid(const Packet& _packet);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //.cpp
     
    bool Validator::is_valid(const Packet& _packet)
    {
    	switch(_packet.getType()) // erreur vient d'ici
    	{
    		// blablabla
    	}
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Packet // .h
    {
    	public:
    		Packet();
    		Packet~Packet ();
     
    		char getType() {return m_type;}
     
    	private:
    		char m_type;
    }

    L'erreur :
    error: no matching function for call to 'Packet::getType() const'
    Merci de votre aide.

  2. #2
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Ce que je ne comprend pas c'est que le mot-clé const permet au compilateur d'optimiser, car il sait que la classe ne sera pas modifié. Et je ne fais qu'un get sur un membre.
    En fait tout le problème provient du fait que ta méthode getType() n'est pas qualifiée const, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char getType() const {return m_type;}
    Du coup, le compilateur te refuse de te laisser l'appeler, puisqu'elle pourrait théoriquement modifier l'objet.

    Edit : Je ne suis pas un expert en optimisation, mais je ne suis pas certain que ce soit l'objectif principal du mot clef const. J'aurais plutôt misé sur une garantie supplémentaire, une façon de mieux décrire le "contrat". En tout cas c'est comme ça que moi je l'utilise.

  3. #3
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,

    Citation Envoyé par manticore
    Ce que je ne comprend pas c'est que le mot-clé const permet au compilateur d'optimiser, car il sait que la classe ne sera pas modifié.
    Le mot clé const ne permet rien "d'optimiser" du tout, c'est une information sémantique à destination du programmeur mais qui a l'énorme avantage d'être vérifié par le compilateur.

    Par exemple :
    error: no matching function for call to 'Packet::getType() const'
    Comme le dit le message d'erreur, le pb vient du fait que tu essayes d'appeler une fonction membre getType qui n'est pas const (donc qui peut potentiellement modifier ses membres) à partir d'une référence constante sur Packet (référence constante qui s'engage à ne pas modifier le packet).

    Il faut définir getType comme suit :

    char getType() const {return m_type;}

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par phi1981 Voir le message
    Edit : Je ne suis pas un expert en optimisation, mais je ne suis pas certain que ce soit l'objectif principal du mot clef const. J'aurais plutôt misé sur une garantie supplémentaire, une façon de mieux décrire le "contrat". En tout cas c'est comme ça que moi je l'utilise.
    C'est tout à fait exact, const permet de mieux qualifier le contrat des services rendus par une classe. Il n'apporte en lui même rien au niveau de l'exécution, en revanche, la version const et non const de deux méthodes qui ont le même nom peut conduire à deux implémentations différentes, et donc à une optimisation potentielle si la version const est appelée quand c'est possible et si elle est plus efficace.

    phi1981, tu rencontres un problème courant qui ressemble à l'usage de constness là où les développeurs qui t'ont précédé ne l'ont pas utilisé. Tu peux soit mettre à jour les méthodes pour lesquelles const manque (méthode conseillée), soit utiliser un const_cast (ce qui est fortement déconseillé). Ca demande un peu plus de travail sur le moment mais c'est payant à long terme.

  5. #5
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Merci de ces explications.

    Donc est-ce que l'on met systématiquement const sur toutes les méthodes qui ne modifie pas le programme ?

    Quelle est la bonne pratique ?

    Dans mon cas est-ce que les getters devrait être systématiquement mis en const ?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Citation Envoyé par manticore Voir le message
    Donc est-ce que l'on met systématiquement const sur toutes les méthodes qui ne modifie pas le programme ?
    Tu met const sur toutes les méthodes qui ne modifient pas l'état de l'objet (la notion de programme n'existe pas ici).

    Citation Envoyé par manticore Voir le message
    Dans mon cas est-ce que les getters devrait être systématiquement mis en const ?
    Oui. Attention, si tu as beaucoup de getters, il y a peut-être un problème d'architecture de code mais cela est un autre sujet.

  7. #7
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2009
    Messages
    377
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2009
    Messages : 377
    Par défaut
    Oui. Attention, si tu as beaucoup de getters, il y a peut-être un problème d'architecture de code mais cela est un autre sujet.
    Non en l'occurrence ça va, j'en ai pas énormément C'est juste pour le principe.

    (la notion de programme n'existe pas ici).
    Oui le terme est mal choisi.

    Merci de tous vos conseils.

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

Discussions similaires

  1. Réponses: 56
    Dernier message: 17/08/2008, 22h56
  2. question sur le mot clef const
    Par elmcherqui dans le forum C++
    Réponses: 3
    Dernier message: 08/07/2008, 08h42
  3. mot cle const
    Par elmcherqui dans le forum C++
    Réponses: 47
    Dernier message: 22/03/2008, 07h36
  4. Réponses: 14
    Dernier message: 25/10/2007, 15h00
  5. [debutant] le mot clé const
    Par r0d dans le forum Débuter
    Réponses: 12
    Dernier message: 21/06/2006, 16h13

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