OVH Cloud OVH Cloud

redefinir == pour un classe

7 réponses
Avatar
David Roman
Bonjour,

Question bete pour vous, mais moi je commence ...

j'ai une classe point et pour comparrer 2 points je fais ceci
if (p1.eq(p2)) {}

j'aimerai faire
if (p1 == p2) {}
Est ce que je peux redefinir ==

Merci

7 réponses

Avatar
Fabien SK
David Roman wrote:
j'aimerai faire
if (p1 == p2) {}
Est ce que je peux redefinir =
class Point

{
public:
bool operator==(const Point &other)const
{
// code ici pour tester si ils sont égaux ou pas
}
};

Conseil: un livre sur le C++

Avatar
Gourgouilloult
Fabien SK wrote:
David Roman wrote:

Est ce que je peux redefinir = >
class Point

{
public:
bool operator==(const Point &other)const
{
// code ici pour tester si ils sont égaux ou pas
}
};


Voire même :

classe Point
{
// ...
// éventuellement, si tu veux comparer les membres privés
friend bool operator == (const Point&, const Point&);
};

bool operator == (const Point& p1, const Point& p2)
{
// code ici pour tester si ils sont égaus ou pas
}

Histoire d'avoir les même possibilités de conversion pour les deux
arguments, à la résolution de surcharge.

Gourgou


Avatar
Benoit Dejean
Le Thu, 16 Oct 2003 13:05:45 +0200, Gourgouilloult a écrit :
Voire même :

classe Point
{
// ...
// éventuellement, si tu veux comparer les membres privés friend
bool operator == (const Point&, const Point&);
};

bool operator == (const Point& p1, const Point& p2) {
// code ici pour tester si ils sont égaus ou pas
}

Histoire d'avoir les même possibilités de conversion pour les deux
arguments, à la résolution de surcharge.


voir même pas friend du tout. je n'ai jamais aimé que == puisse faire la
comparaison alors que moi je ne le suis pas. 2 objets, un chapeau magique,
et hop égaux ou pas. je pense qu'il faut utiliser friend avec parcimonie

Avatar
Christophe Lephay
Benoit Dejean wrote:
classe Point
{
// ...
// éventuellement, si tu veux comparer les membres privés friend
bool operator == (const Point&, const Point&);
};

bool operator == (const Point& p1, const Point& p2) {
// code ici pour tester si ils sont égaus ou pas
}

Histoire d'avoir les même possibilités de conversion pour les deux
arguments, à la résolution de surcharge.


voir même pas friend du tout. je n'ai jamais aimé que == puisse faire
la comparaison alors que moi je ne le suis pas.


Justement, l'idée de friend est que la fonction puisse le faire sans pour
autant te permettre d'accéder aux données privées (ou protected).

2 objets, un chapeau
magique, et hop égaux ou pas. je pense qu'il faut utiliser friend
avec parcimonie


En d'autres termes, il faut l'utiliser quand on en a besoin, ni plus, ni
moins. En l'occurence, friend a quasiment été créé pour ce genre de choses
avec les opérateurs (pour les flux, il me semble)...

Chris


Avatar
Gourgouilloult
Benoit Dejean wrote:

Voire même :

classe Point
{
// ...
// éventuellement, si tu veux comparer les membres privés friend
bool operator == (const Point&, const Point&);
};



(Euh, juste au passage, c'est normal que dans ta réponse, friend se
retrouve sur la ligne précédente ? Si c'est fait exprés, en fait, il
faut enlever toute la déclaration.)

voir même pas friend du tout. je n'ai jamais aimé que == puisse faire la
comparaison alors que moi je ne le suis pas. 2 objets, un chapeau magique,
et hop égaux ou pas. je pense qu'il faut utiliser friend avec parcimonie


J'ai bien dit «éventuellement», pas que je le conseillais. Parmi les
choses que je n'aime pas écrire : des listes infinissables de
déclarations de friend, pour toute une floppée d'opérateurs. Il y a de
nombreuses raisons qui font que je n'ai jamais eu à lire de telles
choses et que j'ai arrêté d'en écrire depuis longtemps. Au point même
qu'à une certaine époque, j'ai fini par avoir du mal à comprendre friend ;)

Gourgou


Avatar
Benoit Dejean
Le Thu, 16 Oct 2003 15:59:34 +0200, Christophe Lephay a écrit :


En d'autres termes, il faut l'utiliser quand on en a besoin, ni plus, ni
moins. En l'occurence, friend a quasiment été créé pour ce genre de choses
avec les opérateurs (pour les flux, il me semble)...


je ne pense pas au contraire

Avatar
Christophe Lephay
Benoit Dejean wrote:


En d'autres termes, il faut l'utiliser quand on en a besoin, ni
plus, ni moins. En l'occurence, friend a quasiment été créé pour ce
genre de choses avec les opérateurs (pour les flux, il me semble)...


je ne pense pas au contraire


tu ne penses pas quoi ?

Quand on surcharge les opérateurs, on le fait souvent via une fonction libre
friend plutôt qu'une fonction membre (pour des question de symétrie). Tu
penses qu'une fonction libre friend est plus problématique qu'une fonction
membre alors qu'elle est censée fournir le même service (modulo les
facilités de conversions en plus) ?

Chris