Surcharge d'opérateur ==

Surcharge d'opérateur == - C++ - Programmation

Marsh Posté le 11-03-2009 à 08:59:54    

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.

Reply

Marsh Posté le 11-03-2009 à 08:59:54   

Reply

Marsh Posté le 11-03-2009 à 11:03:55    

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
 

Reply

Marsh Posté le 11-03-2009 à 11:07:16    

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

Reply

Marsh Posté le 11-03-2009 à 11:09:34    

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
Reply

Marsh Posté le 11-03-2009 à 11:13:22    

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.

Reply

Marsh Posté le 11-03-2009 à 11:17:04    

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. }

Reply

Marsh Posté le 11-03-2009 à 11:20:02    

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

Reply

Marsh Posté le 11-03-2009 à 11:47:46    

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 !

Reply

Marsh Posté le 12-03-2009 à 07:33:50    

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.

Reply

Marsh Posté le 12-03-2009 à 11:21:13    

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. }


Reply

Marsh Posté le 12-03-2009 à 11:21:13   

Reply

Marsh Posté le 12-03-2009 à 11:21:35    

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  ?

Reply

Marsh Posté le 12-03-2009 à 11:27:51    

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
Reply

Marsh Posté le 12-03-2009 à 11:43:06    

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).

Reply

Marsh Posté le 12-03-2009 à 12:27:24    

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 :)

Reply

Marsh Posté le 12-03-2009 à 13:49:29    

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, ...

Reply

Marsh Posté le 13-03-2009 à 08:26:58    

Merci pour les infos supplémentaires

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed