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 :

Opérateur = et nouvel objet


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut Opérateur = et nouvel objet
    Bonjour, je voudrais savoir si l'on pouvait assigner un nouvel objet via la surcharge de l'opérateur =

    Si je fait par exemple :
    Le comportement que j'attends est que a soit égal à un nouvel objet A (et que le précédent soit perdu ici), mais dans l'opérateur =, le pointeur this représente l'objet a, donc je ne peux que modifier a, et si je fait un 'return A(2)' un nouvel objet est bien crée mais il est ignoré, et mon objet a est toujours le premier instancié.

  2. #2
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Tu peux surcharger l'opérateur = avec en paramètre un entier au lieu d'un A.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    A& A::operator=(int i)
    {
         //Affecte ton i dans ton A ici.
    }
    Homer J. Simpson


  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut
    Oui mais ça ne change rien, puisque this est toujours l'objet à gauche du = et non un nouvel objet.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu veux vraiment changer complètement la sémantique de l'opérateur=, tout le monde va te détester mais tu peux:
    Code horrible : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A A::operator=(int i)
    {
         return A(i);
    }
     
    ostream& A::operator<<(ostream& output)
    {
         //Afficher le nombre contenu
    }
    Ceci peut s'utiliser comme cela:
    Code horrible : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    A a(1);
    A b = (a=2);
    cout << a << endl; //Affiche 1
    cout << b << endl; //Affiche 2
    Mais c'est vraiment quelque chose à ne pas faire. La surcharge de opérateurs est faite pour faire marcher la sémantique des opérations dans les classes, pas pour la changer.

    C'est comme implémenter un operator+ qui aurait la sémantique d'un operator+=...
    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.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut
    Dans ton exemple tu crée une deuxième variable sur la base de la première, mais dans ce cas un b(2) suffit pour créer un autre objet, et un a = (a=2) pose le même problème.
    C'est vraiment l'opérateur = que je ne comprends pas, si ce mode de fonctionnement est courant ça signifie quelque part que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    monObjetA = valeur;
    monObjetA = monObjetB;
    // équivaut respectivement à
    monObjetA.setValue(valeur);
    monObjetA.setValue(monObjetB.getValue());
    Alors qu'à mon sens la première ligne représente l'objet dans sa globalité, et donc attendrait davantage une nouvelle instance, plutôt que de manipuler ses membres/méthodes, ce qui n'est pas du tout la même chose.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je ne comprends pas ce que tu racontes.
    Mais ce que tu crois "normal" me fait penser à du scripting.

    Il n'y a pas de A(1) ou de A(2), tu as une variable a qui (peut) prend(re) une valeur.
    Par chance on a un opératuer = qui permet de donner une nouvelle valeur à cette variable, sur la base d'une autre via l'opération.

    Je ne vois franchement pas ce que tu ne comprends pas, ni ce que tu espères. C'est comme ça, c'est tout. Tu "t'adaptes" et tu appliques.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Ce que tu cherches en gros, ce sont les types valeur de .Net: Un = écrase directement le contenu du type, même si ses variables membres sont readonly (ce qui signifie que a=b en .Net marche là où a.setValue(b.getValue()) ne marcherait pas).
    En revanche, un type valeur en .Net ne peut pas avoir de destructeur, ni même de constructeur par défaut.

    Il n'y a rien de tout ça en C++. Pour permettre aux couples constructeur/destructeur de marcher correctement, il n'y a aucune opération de "blit" aveugle, que ce soit en copie ou affectation.
    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.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    112
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 112
    Points : 111
    Points
    111
    Par défaut
    Je suis clairement habitué aux langages de plus haut niveau.

Discussions similaires

  1. Instancier un nouvel objet en php
    Par abderrahmen dans le forum Langage
    Réponses: 1
    Dernier message: 20/10/2008, 21h53
  2. Instancier un nouvel Objet de Classe avec un String
    Par Cribest dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/07/2008, 15h56
  3. Créer un nouvel objet dont on ne connait que le type
    Par NicolasJolet dans le forum C#
    Réponses: 1
    Dernier message: 08/02/2007, 09h02
  4. Ajout nouvel objet dans JList
    Par sorry60 dans le forum Composants
    Réponses: 2
    Dernier message: 09/12/2006, 22h37
  5. Comment cacher des propriétés dans un nouvel objet ?
    Par Pedro dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/10/2003, 18h53

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