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 operateur &


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 22
    Par défaut surcharge operateur &
    Bonjour à tous

    Dans un tp de prog en c++ on me demande de surcharger l'opérateur & pour qu'il affiche et renvoie l'adresse de l'objet.
    J'arrive à le faire mais je n'en vois pas l'intéret.
    Ma question est donc comme vous pouvez le deviner est :

    Quel est interet de surcharger l'opérateur & ?

    Merci d'avance de vos réponses

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par kekelg2006 Voir le message
    Bonjour à tous

    Dans un tp de prog en c++ on me demande de surcharger l'opérateur & pour qu'il affiche et renvoie l'adresse de l'objet.
    J'arrive à le faire

    Et tu fais comment exactement ?

    Edit : Ok j'ai pigé. Effectivement je n'en vois pas d'intérêt immédiat non plus à part peut être démontrer que le C++ permet de faire des trucs vraiment dingue des fois et qu'il faut donc apprendre à se méfier de tout, même d'un innocent &

  3. #3
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    En même temps, c'est pas le but de l'opérateur &? (ok il affiche pas, mais il renvoie l'adresse).

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Goten Voir le message
    En même temps, c'est pas le but de l'opérateur &? (ok il affiche pas, mais il renvoie l'adresse).
    Sauf erreur, lorsque surchargé, l'opérateur & a normalement pour but... d'effectuer un AND binaire...

    En effet, l'opérateur & servant comme "opérateur permettant d'obtenir l'adresse de" n'est pas surchargeable, par contre, l'opérateur de comparaison binaire bien

    L'idée générale étant, par exemple, de le définir pour une énumération proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    enum eMyEnum
    {
        meValue1 = 1<<0,
        meValue2 = 1<<1,
        meValue3 = 1<<2 /*,
        ...
        */
    };
    sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    eMyEnum operator & (eMyEnum e1, eMyEnum e2)
    {
        return eMyEnum(static_cast<int> e1 & static_cast<int> e2);
    }
    Autrement dit, tu peux proprement enguirlander ton prof pour te demander de faire quelque chose de tout à fait erroné

    [EDIT]PS: Ce sont les opérateur * (ce qui est pointé par) et -> ((l'élément du pointeur) qui peuvent être surchargés, lorsque ta classe a sémantique de pointeur ( comme c'est le cas pour les itérateurs )
    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

  5. #5
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Ben si Koala, justement, l'opérateur & ("address-of operator") EST surchargeable, c'est ce que j'ai découvert avec stupeur en essayant.

    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
     
    #include <iostream>
     
    struct S
    {
        S* operator& ()
        {
            std::cout << this << std::endl;
            return (S*)0x666;
        }
        int i;
    };
     
    int main()
    {
        S s;
        S* sptr = &s;
        sptr->i = 5; // OUCH
    }

  6. #6
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Désolé koala, mais l'opérateur adresseof est surchargeable .

    Et donc je me répète : au final ta surcharge à le comportement par défaut de l'opérateur... je capte pas. (a moins que ça soit juste pour l'affichage que le prof voulait surcharger?)

    Citation Envoyé par La norme
    13.5.2
    Both the unary and binary forms of
    + - * &
    can be overloaded.

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 22
    Par défaut
    Je pense que mon prof voulais juste qu'on manipule la surchage des opérateurs dont & (en y ajoutant un affichage).

    Apres ma question etait quel peut etre l'interet de la surcharge d'un tel opérateur dans "la vrai vie" .

    Mais apperement il n'y a pas beaucoup de cas figure ou sa se présente.

    Merci à tous de votre réponse si vous avez d'autres exemples je suis preneur.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035

  9. #9
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    C'est plutôt la version binaire qui est surchargé non?

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 22
    Par défaut
    Voici la question du tp sera plus clair.

    "Ecrire une surcharge de l’opérateur & qui affiche l’adresse en question, et renvoie l’adresse
    de l’objet. Tester cette méthode."

    L'objet en question est un nuage de points constitue de plusieurs points

    J'ai pas eu de probleme pour y répondre mais comme je l'ai déja dit. Je ne vois juste pas l'interet de surchager ce type d'opérateur

  11. #11
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    en fait, il y a un intérêt à surcharger les opérateurs "qui vont bien" avec certaines classes, mais pas n'importe lesquels.

    Ainsi, tu souhaiteras souvent surcharger
    • les opérateurs de flux << et / ou >> pour des classes ayant vocation à assurer la persistance de données (ou à en assurer le transport dans un flux quelconque),
    • les opérateurs artihmétiques ( +, -, *, / ) sur des classes vecteur ou matrice au sens mathématique du terme,
    • les opérateurs étoile, fleche, d'incrémentation et de décrémentation pour les classes ayant sémantique de pointeur,
    • les opérateurs logiques (AND, OR, XOR) sur les classes ayant sémantique d'état
    • les opérateurs de comparaison ( <, >, == et similaires) pour les classes ayant sémantique de valeur (ou, du moins étant "comparables")
    • les opérateur new / new[] et delete / delete[] dans certains cas
    • ...
    parce que ces opérateurs sont utiles à l'utilisation de la classe en fonction de sa sémantique.

    Mais s'il y a bien un opérateur pour lequel la surcharge n'a, à mon avis, aucun sens, c'est l'opérateur & dans son acception "address of"
    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

  12. #12
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Citation Envoyé par kekelg2006 Voir le message
    Apres ma question etait quel peut etre l'interet de la surcharge d'un tel opérateur dans "la vrai vie" .

    Mais apperement il n'y a pas beaucoup de cas figure ou sa se présente.

    Merci à tous de votre réponse si vous avez d'autres exemples je suis preneur.
    + 1
    Je serais moi aussi curieux de connaitre un exemple valable d'utilisation de cet opérateur.

    J'ai parfois l'impression que la personne (Stroustrup ?) qui a rédigé la liste des opérateurs surchargeables lors de la création/normalisation du C++ à simplement fait un recensement exhaustif de tous les opérateurs possibles sans se questionner sur leur pertinence. Et mine de rien, le futur lui a donné raison pour des opérateurs a priori un peu foufou comme -> et *, qui se sont révélés indispensables pour implémenter les pointeurs intelligents....

    Bon par contre pour l'opérateur & je cherche encore.

    Ca viendra peut-être, après tout, les boosteurs ont bien réussi à trouver un emploi pertinent à l'opérateur "virgule" (!) dans Boost.Assign !

  13. #13
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 22
    Par défaut
    Ok merci.

    Apres avoir poser la question a mon prof.

    Il ma dit que cela pouvait etre utile (de redéfinir l'opérateur &) pour retourner l'adresse d'un membre encapsulé. Par exeme exemble lorsque on veut retourner l'adresse d'une structure encapsulé dans une classe.

    Mais effectivement dans le cas du TP cela n'a pas grand intéret.

    Merci a tous.

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par kekelg2006 Voir le message
    Ok merci.

    Apres avoir poser la question a mon prof.

    Il ma dit que cela pouvait etre utile (de redéfinir l'opérateur &) pour retourner l'adresse d'un membre encapsulé. Par exeme exemble lorsque on veut retourner l'adresse d'une structure encapsulé dans une classe.

    Mais effectivement dans le cas du TP cela n'a pas grand intéret.

    Merci a tous.
    dans l'autre sens, je serais d'accord, mais, dans le sens qu'il présente, j'ai de sérieux doutes...

    En effet, si ta classe a sémantique de pointeurs (comme c'est le cas, je le répète, pour les itérateurs), il semble "cohérent" de surcharger les opérateurs * et -> de manière à ce qu'il permettent d'accéder à l'élément pointé.

    Par contre, dans l'autre sens ...
    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

  15. #15
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Citation Envoyé par kekelg2006 Voir le message
    Ok merci.

    Apres avoir poser la question a mon prof.

    Il ma dit que cela pouvait etre utile (de redéfinir l'opérateur &) pour retourner l'adresse d'un membre encapsulé. Par exeme exemble lorsque on veut retourner l'adresse d'une structure encapsulé dans une classe.

    Mais effectivement dans le cas du TP cela n'a pas grand intéret.

    Merci a tous.
    Oula, moi je veux bien, mais ça peut faire de sacré surprise à celui qui va utiliser le code là!


    (à arzar, encore plus fort y'a l'op+ unaire qui est utilisé dans boost... )

  16. #16
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2008
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2008
    Messages : 22
    Par défaut
    Voila l'exemple qu'il me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    struct Encapsulante { inti ; // Donnée à accéder } ;
    Encapsulee o ;
    struct Encapsulee {
    Encapsulee ∗ operator−>(void ) const
    { return &o ; }
    Encapsulee ∗ operator& (void ) const
    { return &o ; }
    Encapsulee & operator* (void ) const
    { return o ; }
    };

  17. #17
    screetch
    Invité(e)
    Par défaut
    je dirai que ca peut etre pas mal pour interdir a quelqu'un d'utiliser un pointeur sur l'objet (donc on ne peut y accéder que par valeur et par référence), en retournant "void" (si c'est possible de changer le type de retour). la comme ca j'ai pas d'exemple ou ca serait utile, mais on ne sait jamais.

  18. #18
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Je sais que certains pointeurs COM intelligents surchargent l'opérateur & unaire, pour qu'on puisse les passer en paramètre à une fonction qui "retourne" un pointeur d'objet.
    Si je me souviens bien, l'opérateur surchargé vérifie que le pointeur interne est nul avant d'accepter.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. surcharge operateur delete et héritage
    Par Hervé dans le forum C++
    Réponses: 5
    Dernier message: 29/03/2006, 14h59
  2. Surcharge operateur =
    Par rulianf dans le forum C++
    Réponses: 9
    Dernier message: 23/02/2006, 01h32
  3. [debutante] surcharge operateur <<
    Par norkius dans le forum Débuter
    Réponses: 3
    Dernier message: 24/10/2005, 13h20
  4. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 16h51
  5. surcharge operateur && pointeurs
    Par le y@m's dans le forum C++
    Réponses: 6
    Dernier message: 10/05/2005, 16h57

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