Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1379 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Surcharge d'opérateur ==

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Surcharge d'opérateur ==

n°1860170
alexandre_​j
Posté le 11-03-2009 à 08:59:54  profilanswer
 

Bonjour,
 
J'ai une classe Action contenant des PointAction. Ces PointAction sont stockés dans une QList (objet Qt). Dans ma classe Action j'ai une fonction addPoint :
 

Code :
  1. void addPoint( const QPoint &point, const QRgb &previousColor ) {
  2.         PointAction* pt = new PointAction( point, previousColor );
  3.         if ( !_points.contains( pt ) )
  4.             _points.push_back( pt );
  5.     }


 
Elle permet d'ajouter un PointAction dans ma QList (en partant d'un QPoint et d'une couleur). J'utilise la fonction "contains" de la QList et dans la doc, il indique que mon objet stocké doit posséder la surcharge de l'opérateur == (là dessus, pas de problème). Dans ma QList, je ne dois pas avoir de points identique (au niveau des coordonnées, mais de la couleur).
 
Ma classe PointAction :
 

Code :
  1. class PointAction
  2. {
  3. public:
  4.     PointAction( const int x, const int y, const QRgb &color )
  5.             :_x( x ), _y( y ), _color( color ) {}
  6.     PointAction( const PointAction &point ) {
  7.         _x = point.x();
  8.         _y = point.y();
  9.         _color = point.color();
  10.     }
  11.     PointAction( const QPoint &point, const QRgb &color ) {
  12.         _x = point.x();
  13.         _y = point.y();
  14.         _color = color;
  15.     }
  16.     ~PointAction() {}
  17.     void setX( const int x ) { _x = x; }
  18.     void setY( const int y ) { _y = y; }
  19.     void setColor( const QRgb &color ) { _color = color; }
  20.     int x() const { return _x; }
  21.     int y() const { return _y; }
  22.     QRgb color() const { return _color; }
  23.     bool operator==( const PointAction &point ) const {
  24.         if (    ( _x == point.x() )
  25.              && ( _y == point.y() ) )
  26.             return true;
  27.         else
  28.             return false;
  29.     }
  30. private:
  31.     int _x;
  32.     int _y;
  33.     QRgb _color;
  34. };


 
Seulement, le tout ne semble pas fonctionner. Il m'ajoute des points qui sont déjà contenu dans ma liste. Est-ce que je suis passé à côté de quelque chose ?
 
Sinon, est-ce que vous avez des remarques sur les bouts de code ? Des choses qu'il ne faut pas faire ou à éviter, etc. Je suis pas expert en cpp mais je suis interessé pour travailler le plus proprement possible.
 
Merci de m'avoir lu.

mood
Publicité
Posté le 11-03-2009 à 08:59:54  profilanswer
 

n°1860213
Joel F
Real men use unique_ptr
Posté le 11-03-2009 à 11:03:55  profilanswer
 

operator== est symmétrique => fonction libre et non méthode
En suite le if return true/false est assez moche hein
return ( _x == point.x() ) && ( _y == point.y() )
ca suffit
 

n°1860217
Un Program​meur
Posté le 11-03-2009 à 11:07:16  profilanswer
 

Es-tu sur que les QList testent l'egalite des valeurs pointees et pas simplement des pointeurs?

n°1860222
alexandre_​j
Posté le 11-03-2009 à 11:09:34  profilanswer
 

Merci pour ta réponse.
Je ne comprend pas trop ce que tu veux dire par :
 

Citation :

operator== est symmétrique => fonction libre et non méthode


Message édité par alexandre_j le 11-03-2009 à 11:10:05
n°1860226
alexandre_​j
Posté le 11-03-2009 à 11:13:22  profilanswer
 

Un Programmeur a écrit :

Es-tu sur que les QList testent l'egalite des valeurs pointees et pas simplement des pointeurs?


 
Désolé j'avais pas vu le post entre temps.
 
Enfait j'en sais trop rien :
 

Citation :

bool QList::contains ( const T & value ) const
 
Returns true if the list contains an occurrence of value; otherwise returns false.
 
This function requires the value type to have an implementation of operator==().
 
See also indexOf() and count().


 
Je ne sais pas trop comment l'interpréter. Je vais essayer de regarder le code de la fonction contains.

n°1860229
alexandre_​j
Posté le 11-03-2009 à 11:17:04  profilanswer
 

C'est un peu hard pour moi, mais j'ai l'impression qu'il se base bien sur l'opérateur == des objets gérés :
 

Code :
  1. template <typename T>
  2. Q_OUTOFLINE_TEMPLATE QBool QList<T>::contains(const T &t) const
  3. {
  4.     Node *b = reinterpret_cast<Node *>(p.begin());
  5.     Node *i = reinterpret_cast<Node *>(p.end());
  6.     while (i-- != b)
  7.         if (i->t() == t)
  8.             return QBool(true);
  9.     return QBool(false);
  10. }

n°1860232
Un Program​meur
Posté le 11-03-2009 à 11:20:02  profilanswer
 

Et comme tes objets sont des pointeurs... ce sont les pointeurs qui sont compares.

n°1860246
alexandre_​j
Posté le 11-03-2009 à 11:47:46  profilanswer
 

Un Programmeur a écrit :

Et comme tes objets sont des pointeurs... ce sont les pointeurs qui sont compares.


 
Je ne gère plus de pointeur dans ma QList et effectivement ça fonctionne !
Je n'étais pas obligé de gérer un pointeur, donc ça résoud mon problème. Mais dans le cas où je suis obligé de gérer des pointeurs, comment faire ? (c'est juste par curiosité).
 
Merci !

n°1860599
alexandre_​j
Posté le 12-03-2009 à 07:33:50  profilanswer
 

Joel F a écrit :

operator== est symmétrique => fonction libre et non méthode
En suite le if return true/false est assez moche hein
return ( _x == point.x() ) && ( _y == point.y() )
ca suffit


 
Je me permet de reposer ma question sur t'as première phrase Joel F, j'ai pas compris ce que tu voulais dire.

n°1860659
Joel F
Real men use unique_ptr
Posté le 12-03-2009 à 11:21:13  profilanswer
 

Je veut dire que operator== n' a pas a etre une methode.
 

Code :
  1. bool operator==( A const& a, A const& b)
  2. {
  3.   return ...; //un test
  4. }


mood
Publicité
Posté le 12-03-2009 à 11:21:13  profilanswer
 

n°1860660
Joel F
Real men use unique_ptr
Posté le 12-03-2009 à 11:21:35  profilanswer
 

alexandre_j a écrit :


 
Je ne gère plus de pointeur dans ma QList et effectivement ça fonctionne !
Je n'étais pas obligé de gérer un pointeur, donc ça résoud mon problème. Mais dans le cas où je suis obligé de gérer des pointeurs, comment faire ? (c'est juste par curiosité).
 
Merci !


 
Utiliser sd::list est-il envisageable  ?

n°1860665
alexandre_​j
Posté le 12-03-2009 à 11:27:51  profilanswer
 

Joel F a écrit :


 
Utiliser sd::list est-il envisageable  ?


 
Ca serait envisageable, mais je préfère utiliser un max d'objets Qt. J'en déduis qu'avec une std::list, je n'aurais pas eu ce soucis ?
 
Merci de ta réponse

Message cité 1 fois
Message édité par alexandre_j le 12-03-2009 à 11:28:13
n°1860676
Un Program​meur
Posté le 12-03-2009 à 11:43:06  profilanswer
 

alexandre_j a écrit :

Ca serait envisageable, mais je préfère utiliser un max d'objets Qt. J'en déduis qu'avec une std::list, je n'aurais pas eu ce soucis ?


 
Si (en fait, si tu penses que c'est un soucis, ca me fait penser qu'il y a peut-etre de la confusion de ta part entre pointeur et objet pointe).  Mais comme nous connaissons mieux la lib standard que QT, on aurait pu te donner la solution (il y en a peut-etre une avec QT, je connais simplement pas du tout cette lib).

n°1860703
alexandre_​j
Posté le 12-03-2009 à 12:27:24  profilanswer
 

Il doit y avoir confusion alors :)
 
Finalement, j'en viens à me poser la question suivante : Quand est-ce qu'il est nécessaire d'avoir une liste de pointeur d'objet au lieu d'une liste d'objet ?
 
Je vois le cas lorsqu'on a un polymorphisme (class A abstraite, class B : A, class C : A) et qu'on doit stocker tout ces objets on a un std::list< A* > _obj;
Mais j'imagine que c'est pas le seul cas.
 
Ou peut-être que je suis à côté de la plaque :)

n°1860728
Un Program​meur
Posté le 12-03-2009 à 13:49:29  profilanswer
 

alexandre_j a écrit :

Quand est-ce qu'il est nécessaire d'avoir une liste de pointeur d'objet au lieu d'une liste d'objet ?


 
Quand est-ce que tu utilises un pointeur plutot qu'un objet?
 
Note: techniquement, le pointeur est un objet pour le C++.  Il n'y a pas reellement de confusion ici, mais il faut parfois faire plus attention a la terminologie.
 

Citation :

Je vois le cas lorsqu'on a un polymorphisme (class A abstraite, class B : A, class C : A) et qu'on doit stocker tout ces objets on a un std::list< A* > _obj;


 
Quand tu dois faire de l'allocation dynamique, structure de donnee dynamique, necessite de controler la duree de vie, semantique de reference, ...

n°1861014
alexandre_​j
Posté le 13-03-2009 à 08:26:58  profilanswer
 

Merci pour les infos supplémentaires


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Surcharge d'opérateur ==

 

Sujets relatifs
problème surcharge opérateursurcharge de l'opérateur [][]
surcharge operateur <Probleme de surcharge d'opérateur et de fonction amies
surcharge de l'opérateur =Surcharge de l'opérateur = + Appel non souhaité à delete
Surcharge d'opérateur sur des structuressurcharge opérateur [ ]
Surcharge d'opérateursurcharge de l'operateur >>
Plus de sujets relatifs à : Surcharge d'opérateur ==


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR