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 :

fonction membre const


Sujet :

C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut fonction membre const
    Bonjour, j'ai un attribut de ma classe qui est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::map<std::string,ParamIndQual *> _paramIndQual;
    j'ai un getter qui est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void VeI0::getParam(const string & temp,vector<double> & param)
    {
    	param = _paramIndQual[temp]->getParam();
    }
    j'aimerais que cette fonction membre soit const, donc faire un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void VeI0::getParam(const string & temp,vector<double> & param) const
    {
    	param = _paramIndQual[temp]->getParam();
    }
    mais comme j'ai une map, _paramIndQual[temp] peut potentiellement être modifié donc je ne peux pas mettre mon const.

    Savez-vous comment faire pour spécifier au compilo que je veux que ce soit const (je travaille avec Visual 2005) ?

    Merci d'avance

  2. #2
    Membre extrêmement actif

    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 408
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 408
    Par défaut
    passer par la méthode find de la map permet de récupérer un itérateur sur la map si la valeur est trouvée, et ça évite d'utiliser l'opérateur crochet.

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 3
    Par défaut
    BOnjour.
    Si je me trompe pas, l'opérateur crochet peut être en const ou pas (sur les std::vector du moins), le compilateur décide tout seul, si il faut utiliser l'oérateur avec const ou non.
    c'est la fonction GetParam() de _paramIndQual[temp] qui doit être const pour que ça marche bien.

  4. #4
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    Une fonction 'const' ne peut pas initialiser de valeur. Donc toute affectation de valeur dans une fonction 'const' est prohibée !!!

    Une fonction 'const' se comporte de la même façon qu'une variable !

    Toute tentative de modification de valeur provoquera une erreur de compilation.

    @+

  5. #5
    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
    Par défaut
    Bonjour,
    Citation Envoyé par Polo_asm Voir le message
    BOnjour.
    Si je me trompe pas, l'opérateur crochet peut être en const ou pas (sur les std::vector du moins), le compilateur décide tout seul, si il faut utiliser l'oérateur avec const ou non.
    La vérité des vecteurs n'est pas celle des map . L'opérateur [] de std::map n'existe pas en constant car std::map::operator[] est équivalent à une insertion :
    Citation Envoyé par norme
    23.3.1.2 map element access
    T& operator[](const key_type& x);
    Returns: (*((insert(make_pair(x, T()))).first)).second.

  6. #6
    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
    Par défaut
    Citation Envoyé par Chessmaster1966 Voir le message
    Une fonction 'const' ne peut pas initialiser de valeur. Donc toute affectation de valeur dans une fonction 'const' est prohibée !!!

    Une fonction 'const' se comporte de la même façon qu'une variable !

    Toute tentative de modification de valeur provoquera une erreur de compilation.

    @+
    Par valeur, tu entends bien membre de la classe de la fonction const.

  7. #7
    Membre actif Avatar de Chessmaster1966
    Inscrit en
    Juillet 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 63
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Par valeur, tu entends bien membre de la classe de la fonction const.
    Cela me paraît évident puisque le sujet initial traite de l'usage d'un 'const' sur fonction membre.

    Alors oui, une fonction membre 'const' ne peut pas initialiser des données membres.

    @+

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Bonjour, La vérité des vecteurs n'est pas celle des map . L'opérateur [] de std::map n'existe pas en constant car std::map::operator[] est équivalent à une insertion :
    Je comprends, mais si je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    param = _paramIndQual[temp]->getParam();
    il n'y a aucune insertion... C'est pourquoi je trouve bizarre le fait qu'il n'y ait pas comme les std::vector une surcharge de l'opérateur [] (const et non const)

    Ce n'est pas la même chose que de faire par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    _paramIndQual[temp].toto = 3;
    Je vais donc me replier sur la fonction membre find()

  9. #9
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    il n'y a aucune insertion... C'est pourquoi je trouve bizarre le fait qu'il n'y ait pas comme les std::vector une surcharge de l'opérateur [] (const et non const)
    Il y aura une insertion si aucun élément est trouvé, il te renverra alors une référence sur l'élément avec la valeur ajouté.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Citation Envoyé par Astraya Voir le message
    Il y aura une insertion si aucun élément est trouvé, il te renverra alors une référence sur l'élément avec la valeur ajouté.
    je n'ai pas compris ta réponse. Où se trouve l'insertion dans ma std::map _paramIndQual ? Quelle est la valeur qui sera insérée ? Et à quelle place ?

  11. #11
    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
    Par défaut
    Quant tu fais ma_map[cle], s'il n'existe pas d'entrée pour cle dans ma_map, alors une entrée est créé avec cette cle et ajoutée à ma_map et la valeur est retournée. C'est pour cela que l'opérateur [] n'existe pas en const. C'est ce que voulais dire Astraya.
    Etant donné le comportement actuel de l'opérateur [], si tu en définis un const. Que devrait-il faire si la clé n'existe pas ? Un comportement assez différent de la version non const. CE qui serait déroutant. D'où la seule version en non const.

Discussions similaires

  1. précisions sur les fonctions membres const
    Par deubelte dans le forum Débuter
    Réponses: 3
    Dernier message: 07/03/2012, 00h08
  2. Switch dans fonction membre
    Par Raish dans le forum C++
    Réponses: 11
    Dernier message: 30/03/2005, 14h41
  3. Réponses: 10
    Dernier message: 03/02/2005, 13h09
  4. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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