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 :

Surcharge de l'opérateur T


Sujet :

C++

  1. #1
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut Surcharge de l'opérateur T
    Bonjour à tous

    Alors voila en parcourant quelques lignes de code j'ai pu voir ceci :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
        template<class T>
        class CAttribute
        {
        protected:
     
            /// Type de l'attribut.
            Ogre::String mType;
     
            /// Valeur de l'attribut.
            T mValue;
     
        public:
     
     
            CAttribute(const Ogre::String& type = "null", T value = T()):
            mType(type),
            mValue(value)
            {}
     
            //! Destructeur.
            virtual ~CAttribute(void)
            {}
     
            ...
            ...
     
            T getValue(void) const { return mValue; }
     
            T operator() (void) { return mValue; }
     
            virtual operator T() const { return getValue(); }
        };
    Que signifie les surcharges de l'opérateur suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    T operator() (void) { return mValue; }
    virtual operator T() const { return getValue(); }
    Sachant que un CAttribute est encapsulé dans un boost::shared_ptr<>

    Kromagg

  2. #2
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    cela permet d'écrire quelque chose comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CAttribute<int> mon_attribut;
     
    int val = mon_attribut();
     
    //qui est strictement équivalent à
    int val = mon_attribut.getValue();
    Par contre, je ne comprends pas l'intérêt d'avoir une version 'virtual' et une version non 'virtual' de la même fonction

  3. #3
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Ben peut-être la surcharge de l'opérateur const.

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Je suis d'accord pour 2 versions, une avec const et une autre sans const. Mais pourquoi 1 virtuelle et pas l'autre ?

  5. #5
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Ce ne sont pas les mêmes opérateurs.

    Le premier est un opérateur() renvoyant un T ou encore opérateur "d'appel de fonction". Il permet d'avoir du code comme celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CAttribute<int> attr;
    //...
    int i = attr(); // syntaxe en (), comme un appel de fonction
    Le deuxième est un opérateur de conversion, ici conversion vers T, qui permet d'avoir du code comme celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CAttribute<int> attr;
    //...
    int i = attr; // conversion

  6. #6
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Il laisse soin à ces descendant de modifier le getters tant que sa garantie un comportement constant ?

    [Edit] Maintenant que tu le dis oO !

  7. #7
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <quelquechose> operator() (arguments);
    est une définition de l'opérateur () pour ta classe, qui retourne un "truc" de type <quelquechose>.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    operator <quelquechose>();
    (avec ou sans virtual)
    est un opérateur de conversion vers le type <quelquechose>. Ca permet de dire au compilo : si l'occasion se présente, si t'as besoin de convertir ma classe en un <quelquechose>, utilise ceci, c'est fait pour.

  8. #8
    Membre habitué Avatar de Kromagg
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2008
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2008
    Messages : 275
    Points : 198
    Points
    198
    Par défaut
    Merci à tous pour vos réponses

    En fait c'était surtout la 2ème surcharge qui me posée problème. Et le gars l'utilise bien pour une conversion. En fait chaque CAttribute<T> est mis dans un boost::shared_ptr<>

    Du coup si je fais pas exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    shared_ptr<CAttribute<int> > monIntPtr(new CAttribute<int>(10));
    Après au lieu de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int monInt = monIntPtr->getValue();
    Et bien on peut faire ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int monInt = *monIntPtr;
    Topic résolu
    Kromagg

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

Discussions similaires

  1. Surcharge de l'opérateur new
    Par :Bronsky: dans le forum C++
    Réponses: 17
    Dernier message: 27/10/2010, 22h33
  2. Réponses: 8
    Dernier message: 29/08/2006, 01h56
  3. [C#] Surcharge de l'opérateur ==
    Par LE NEINDRE dans le forum Windows Forms
    Réponses: 3
    Dernier message: 18/07/2006, 17h19
  4. Réponses: 6
    Dernier message: 12/07/2006, 16h34
  5. Réponses: 15
    Dernier message: 25/01/2005, 17h51

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