2017-08-15 6 views
-1

J'essaie d'apprendre la surcharge d'un opérateur en C++. J'ai suivi un tutoriel et surchargé l'opérateur '==' pour pouvoir comparer des objets d'une classe entre eux. Comme ceci:Opérateur C++ Surcharge l'opérateur égal à

bool Vector2::operator==(const Vector2& v) const 
{ 
    return ((x_==v.GetX()) && (y_==v.GetY())); 
} 

Ma classe a deux vars en elle (x_ et y_). J'ai créé deux objets de cette classe donné quelques valeurs et les ai comparés et cela a fonctionné très bien. Mais ensuite j'ai utilisé l'opérateur == pour comparer aux entiers et cela a aussi bien fonctionné. Maintenant, je m'attendais à ce que l'opérateur == ne travaille pas sur les entiers parce que je venais juste de le surcharger pour faire autre chose. Mais encore ça l'a fait. Donc, je suis un peu confus en ce moment. Et j'ai cette question:

Comment se fait l'opérateur == après avoir été surchargé comme cela peut encore être utilisé pour comparer des entiers/flotteurs/doubles/etc? Dans mon cas, quand il voit un objet de classe Vector2 comme deuxième paramètre, il agit comme dans la version surchargée et quand il voit quelque chose d'autre, il agit normalement?

Aussi une autre question: J'ai un class classA et un class classB tous les deux avec 2 variables et seulement différents dans le nom. Je crée deux objets un pour classA objA et un pour classB objB et je donne quelques valeurs avec dire un constructeur par défaut.

Maintenant, est-il possible de surcharger le operator == pour faire une comparaison comme if(objA==objB)? Ou est-ce que les opérandes dans l'expression doivent être du même type? Soit classA ou classB?

Aidez-moi à résoudre ce problème. Merci pour la lecture!

+0

de quel type est 'x_' et' y_'? – Malice

+0

Vous devez ajouter plus d'informations sur la source. –

+2

Vous avez défini '==' pour 'Vector2', pas pour' int'. La surcharge est _by definition_ une implémentation pour _different_ types/arguments. Les autres implémentations ne sont pas affectées. Cependant si vous deviez *** redéfinir *** '==' pour 'int', ce serait une histoire différente –

Répondre

1

Si votre classe Vector2 a un constructeur qui prend un int et non marqué explicit, il permet des entiers à convertir implicitement Vector2 comme indiqué dans cet exemple:

#include <iostream> 
#include <assert.h> 

struct S 
{ 
    S(int x) : x(x) {} 

    bool operator==(const S& other) const 
    { 
     return x == other.x; 
    } 
    int x; 
}; 

int main() { 
    S s1{5}; 
    S s2{5}; 

    assert(s1 == s2); 

    assert(!(s1 == 5)); 

    return 0; 
} 

Ideone

Cette code compile, mais la deuxième assertion échoue, car 5 est converti en S.