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

Langage C++ Discussion :

this->champ vs Class::champ


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut this->champ vs Class::champ
    Bonjour,

    J'ai une classe RangeWidget qui possède un champ float max_m. J'ai demandé à CLion de générer un setter pour ce champ. Voici le code généré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void RangeWidget::setMax_m(float max_m)
    {
        RangeWidget::max_m = max_m;
    }
    Je me serais attendu à cette écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void RangeWidget::setMax_m(float max_m)
    {
        this->max_m = max_m;
    }
    J'allais dire "je ne connaissais pas cette écriture Class::champ" mais en y réfléchissant bien, je l'avais déjà vu pour éviter des conflits lors d'héritage multiple.

    Ma question est très simple : faut-il préférer this->champ ou Class::champ ?

    Merci !

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Il y même 4 possibilités pour un membre non statique dans une fonction membre non statique s'il n'y a pas d'ambiguité.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    this->RangeWidget::max_m;
    RangeWidget::max_m;
    this->max_m;
    max_m;
    Laquelle est préférable : la dernière, c'est clair et net. En ayant évité d'avoir un paramètre de même nom.
    Sinon j'ai une préférence pour this->max_m s'il n'y a pas d'ambiguïté et sur la première sinon.

  3. #3
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    En théorie, Class::champ est un nom qualifié, recherché différement des noms non qualifiés.
    Le compilateur doit chercher le scope Class puis parmi les variables de ce scope. Et si le scope est une classe, vérifier que *this en dérive.

    this->champ au contraire, est un accès par un nom non qualifié, mais dans *this uniquement.

    D'un point de vue strictement lié à la norme, this-> est plus efficace, car saute l'étape de recherche dans les variables locales.
    S'il y a une différence, c'est uniquement sur le temps de compilation.

    En pratique, il est hautement probable que la différence soit nulle, le compilateur pouvant avoir en interne une table de noms connus, comprenant notamment les noms trouvés dans *this.

    Par contre, pour la lecture du code, le plus clair est encore la troisième solution: utiliser un préfixe ou un suffixe pour les membres (m_champ ou champ_).
    L'effet est alors équivalent à Class::champ.

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 768
    Par défaut
    l'écriture RangeWidget::max_m; n'est pas pour appeler un attribut statique ?


    Et sinon :: (les 2 2 points) c'est l'opérateur de résolution de portée

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Normalement, c'est plus pour ca, mais je crois bien que cela fonctionne.
    Même si, en me creusant la tête, je ne me souviens de m'en être servi que pour des fonctions.

    d'après cppreference.com, le "qualified_lookup" peut chercher un "class member (including static and non-static functions, types, templates, etc)".
    Donc, oui, ca doit fonctionner

  6. #6
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 768
    Par défaut
    Ouais cela doit fonctionner, parce que de souvenirs , c'est l'écriture que l'on utilise pour résoudre les problèmes d'héritage multiple en losange, ... en spécifiant quelle classe mère on choisit

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 502
    Par défaut
    Je pense que les concepteurs/implémenteurs de CLion ont pris la 2ème écriture car cela donne une implémentation la plus "robuste".
    La plus simple, la 4ème, est sujet aux collisions de noms entre l'argument et le champ.
    La plus "naturelle", la 3ème, oblige l'IDE à déterminer si le champ est statique ou pas, et le code pètera si l'utilisateur change la nature static/d'instance du champs.
    La 1ère est plus complexe (mais en code auto-généré, on sent fout) et dispose des mêmes limitations que la 3ème.

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

Discussions similaires

  1. Class champ Image
    Par Invité dans le forum C#
    Réponses: 0
    Dernier message: 03/04/2011, 12h32
  2. Réponses: 2
    Dernier message: 29/11/2010, 12h17
  3. Réponses: 2
    Dernier message: 21/08/2008, 12h46
  4. Listé déroulante classée + champ « tous »
    Par joshua12 dans le forum IHM
    Réponses: 2
    Dernier message: 20/06/2007, 14h28
  5. Plusieurs champs, même classe, nombre inconnu
    Par anayathefirst dans le forum Struts 1
    Réponses: 2
    Dernier message: 25/01/2007, 14h19

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