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 :

question redefinition "operator ="


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut question redefinition "operator ="
    Bonjour,

    Si on définit une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class nouveau_type
    {
      private:
          int m_valeur;
      public:
       nouveau_type& operator=(nouveau_type const &val)
      {
        this->m_valeur=val;
        return(*this);
      }
    };
    Avec la redéfinition de l'opérateur= comme précédent, il est donc possible d'effectuer l'opération suivante:

    nouveau_type A = 7; //équivalent a A.m_valeur = 7;

    J'en arrive donc a ma question===>
    est il possible de faire l'inverse?

    cad redéfinir l'opérateur= "standard"(agissant sur les types int/float/short/etc)...de telle sorte que le compilateur comprenne que

    (int = nouveau_type) est équivalent à (int = nouveau_type.m_valeur)

    (je pense à une redéfinition comme pour l'opérateur std::operator<< )

    Merci d'avance de vos idées!

    (Pour l'instant j'utilise une fonction "to_float" qui me retourne la valeur, mais ca complique la prog et la lisibilité, c'est quand meme plus joli un "=" transparent!)

  2. #2
    screetch
    Invité(e)
    Par défaut
    oui tu peux regarder les operateurs de cast

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class mon_type
    {
      operator int() { return m_value; }
    };
     
    mon_type a = 7;
    int x = a;

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    bien merci screetch!

    je savais pas que ca existait cette possibilité

    ca marche avec tous les types!
    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
     
        operator unsigned char() 
        { 
            return (this->m_pt_float.to_float()); 
        }
     
        operator signed char() 
        { 
            return (this->m_pt_float.to_float()); 
        }
        operator unsigned short() 
        { 
            return (this->m_pt_float.to_float()); 
        }
        operator signed short() 
        { 
            return (this->m_pt_float.to_float()); 
        }
        operator unsigned long() 
        { 
            return (this->m_pt_float.to_float()); 
        }
        operator float() 
        { 
            return (this->m_pt_float.to_float()); 
        }
        operator int() 
        { 
            return (this->m_pt_float.to_float()); 
        }

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Les conversions implicites, c'est dangereux, car tu peux te retrouver avec des valeurs bizarres sans svaoir d'où elle viennent.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Les conversions implicites, c'est dangereux
    Dangereux, le mot est peut-être fort mais ça fini par poser des problèmes quand on ne restreint pas leur utilisation.

    En passant, loicounet, tu abuses de this et les conversions implicites qui ne sont pas const, ça me semble avoir guère de sens.

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    On me le dit tout le temps, n'y va pas à la hache. C'est vrai je prend la bombe A.

    Disons que les conversion implicites, si c'est mal gérées , ca te fout un bordel pas possible, la plus part du temps, pour un service rendu assez faible.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut
    oui ca fait barbare comme conversion, je vais rajouter un test avec un cerr<< si on dépasse la plage de représentation!

    pour le this c'est vrai que c'est inutile...

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    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 395
    Par défaut
    Ce qui est dommage, c'est qu'on ne peut pas déclarer explicit ces opérateurs de conversion...
    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.

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Par défaut


    justement je cherchais dans mon bouquin pour voir si ya moyen de faire les opérateur de cast explicite
    ==>
    bon ben si ca existe pas je vais arrêter de chercher ca alors!

    J'ai vu aussi qu'une façon d'éviter les utilisations abusives (à l'insu de notre plein gré comme disait un certain cycliste) est de bien redéfinir tous les opérateurs de la classe (+,-,*,/,+=,-=,*=,/=,++,--,<<,>>,<<=,>>=, !=,>,<,<=,>=,==,...)

    Apparemment lorsque le compilo arrive sur une opération il cherche en premier s'il existe un opérateur redéfini, puis s'il ne trouve pas il tente la conversion...
    (à partir de la on voit clairement que l'autorisation de cast peut autoriser des opérations qui n'étaient pas possible et qui le devienne!)


    exemple:
    J'ai commenté ma redéfinition de l'operation addition de:
    mon_type operateur+(int op1, mon_type op2)

    avant que je definisse le cast "operator int() ", le compilo beuglait
    après définition, op2 est convertit!

    oula... terrain glissant!

  10. #10
    screetch
    Invité(e)
    Par défaut
    ah c'est ma faute c'est moi qui ait oublié le const en haut.

    * court se fouetter avec un emballage de snickers

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

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