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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair� Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par d�faut surcharge operateur =
    Bonjour.

    J'ai cr�e une classe "Point" (un point = 2 coordonn�es) juste dans le but d'essayer de faire des surcharge d'op�rateurs et de comprende un peu comment tout cela fonctionne.

    Sans rentrer dans les d�tails de la classe, mon but est de pouvoir surcharger l'op�rateur "=" de fa�on a faire une copie d'un Point. J'ai d'abord �crit une fonction "equals" de mani�re normale, et je l'ai ensuite modif�e pour surcharger "=". Probl�me: ma fonction "equals" fonctionne, mais pas mon op�rateur "=":
    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
     
    //temp
    Point* Point::equals(Point* p)
    {
      delete this;
      Point* temp = new Point(p);
      return temp;
    }
     
    //operators:
    Point* Point::operator=(Point* p)
    {
      delete this;
      Point* temp = new Point(p);
      return temp;
    }
    et dans mon main:
    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
     
    int main(void)
    {
      Point* p1 = new Point(2,3); // p1 = (2,3)
      Point* p2 = new Point();     // p2 = (0,0)
      Point* p3 = new Point();     // p3 = (0,0)
     
      p2->equals(p1);                // p2 = (2,3)
      p3 = p1;                          // p3 = (2,3)
     
      p1->SetXY(10,10);            // ERREUR: ça modifie p1 ET p3.
      // donc p3 n'est pas une "deep copy" de p1, mais juste un "alias".
      // pourquoi???
     
      return 0;
    }
    Que dois-je modifier � ma fonction "equals" pour en faire un op�rateur "=" qui ait le m�me comportement, et que n'ais-je pas compris?

    Merci

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    D�tails du profil
    Informations personnelles :
    �ge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par d�faut
    M'�tonnes que �a marche ton code...
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Point* temp = new Point(p);
    Ca ne serait pas plut�t
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    Point* temp = new Point(*p);
    ??
    Le constructeur par copie prend en param�tre une r�f�rence sur un objet, et pas un pointeur sur un objet...

    Et pour ton probl�me, quand tu fais
    Tu affectes p1 � p3. Mais p1 et p3 sont des pointeurs, pas des objets ! Donc tu affectes l'adresse de p1 � p3. Normal qu'� la fin ce soit la m�me chose.

    Pour appeler l'op�rateur d'affectation, tu dois faire :
    C'est � dire 'd�pointer' tes pointeurs... L�, c'est l'objet point� par p3 qui est "affect�" de l'objet point� par p1.

  3. #3
    Membre �clair� Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    D�tails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Par d�faut
    Citation Envoy� par Eusebe
    Et pour ton probl�me, quand tu fais

    Tu affectes p1 � p3. Mais p1 et p3 sont des pointeurs, pas des objets ! Donc tu affectes l'adresse de p1 � p3. Normal qu'� la fin ce soit la m�me chose.

    Pour appeler l'op�rateur d'affectation, tu dois faire :
    C'est � dire 'd�pointer' tes pointeurs... L�, c'est l'objet point� par p3 qui est "affect�" de l'objet point� par p1.
    Merci, c'�tait effectivement �a l'erreur.

    Par contre pour le "constructeur par copie", il fonctionne.
    Je l'ai d�finiti comme �a:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
      Point(Point* p)
      {
        this->x = p->x;
        this->y = p->y;
      }
    Est-ce qu'il y a quelque chose de mal la dedans?
    merci

  4. #4
    R�dacteur
    Avatar de Bakura
    Homme Profil pro
    �tudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par d�faut
    Citation Envoy� par Biosox
    Merci, c'�tait effectivement �a l'erreur.

    Par contre pour le "constructeur par copie", il fonctionne.
    Je l'ai d�finiti comme �a:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
      Point(Point* p)
      {
        this->x = p->x;
        this->y = p->y;
      }
    Est-ce qu'il y a quelque chose de mal la dedans?
    merci
    Oui c'est bon,... Je te conseille d'utiliser �a comme �a :

    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
    34
    35
    36
    37
    38
    #include <iostream>
    using namespace std;
     
    class Point
    {
       public:
          Point (int x = 0, int y = 0) {iX = x, iY = y;}
          Point (const Point &);
          ~Point () {};
     
          Point & operator= (const Point &);
     
          int iX, iY;
    };
     
    Point::Point (const Point & p)
    {
       iX = p.iX;
       iY = p.iY;
    }
     
    Point & Point::operator= (const Point & droite)
    {
       this->iX = droite.iX;
       this->iY = droite.iY;
     
       return *this;
    }
     
    int main()
    {
    	Point p1 (2, 3); // (2, 3)
    	Point p2 (p1); // (2, 3) aussi
     
    	Point p3 = p2; // (2, 3);
     
    	return 0;
    }

  5. #5
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    D�tails du profil
    Informations personnelles :
    �ge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par d�faut
    Citation Envoy� par Biosox
    Par contre pour le "constructeur par copie", il fonctionne.
    Je l'ai d�finiti comme �a:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
      Point(Point* p)
      {
        this->x = p->x;
        this->y = p->y;
      }
    Est-ce qu'il y a quelque chose de mal la dedans?
    merci
    Ben, c'est juste que ce n'est pas 'vraiment' le construteur par copie.
    Le constructeur par copie prend en param�tre une r�f�rence sur un objet (ou sur un objet constant).
    Et donc, dans ton cas, comme tu ne d�finis pas de constructeur par copie, il est toujours cr�� par le compilateur...

  6. #6
    R�dacteur

    Avatar de Matthieu Brucher
    Profil pro
    D�veloppeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

    Informations professionnelles :
    Activit� : D�veloppeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par d�faut
    Ton code est... comment dire... � �viter comme la peste ?
    Attention � bien savoir ce que tu manipules, il y a une diff�rence entre instance et pointeur vers une instance, et les m�thodes appel�es seront diff�rentes selon les cas.
    Dans ton cas, pour un pointeur, tu ferais mieux d'utiliser directement les objets et pas des pointeurs.

  7. #7
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Patch pour le code de bakura : l'op�rateur d'affectation est cens� renvoy� une r�f�rence non constante.

    NB: vu que ton point ne semble contenit que des entiers, inutile d'�crire les deux op�rations de recopie. Celles fournies par d�faut suffisent et sont parfaitement efficaces.

    PS: Une classe comme un point a typiquement une s�mantique de valeur, et est � deux doigts de disposer de son alg�bre -- � voir comment tu t'en serviras. Autrement dit, les manipuler via des pointeurs n'est pas du tout adapt�. C'est tr�s "Java" comme fa�on de faire.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

Discussions similaires

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

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