51 votes

Pourrais-je utiliser l'opérateur == si j'ai seulement implémenté l'opérateur <?

J'ai implémenté operator< pour un certain objet. Logiquement, si !(a < b) et !(b < a) cela signifie que a == b.

Est-ce que cela est déduit automatiquement ? Puis-je utiliser == si j'ai seulement implémenté < ?

3voto

Andrew Kashpur Points 479

Considérez l'exemple suivant:

class point{

  unsigned int x;
  unsigned int y;

  public:
    bool operator <(const point& other){
      return (x+y) < (other.x+other.y);
    }

    bool operator == (const point& other){
      return (x==other.x) && (y==other.y);
    }
}

Et puis nous avons:

point a{1, 2};
point b{2, 1};

!(a < b), !(b < a) , mais aussi !(a == b).

2voto

Foo Is Bar Points 21

Genre.
Mais vous auriez besoin de boost::operators

Les opérateurs surchargés pour les types de classe surviennent généralement en groupes. Si vous pouvez écrire x + y, vous voulez probablement aussi pouvoir écrire x += y. Si vous pouvez écrire x < y, vous voulez aussi x > y, x >= y et x <= y. De plus, à moins que votre classe n'ait un comportement vraiment surprenant, certains de ces opérateurs connexes peuvent être définis en termes d'autres (par exemple, x >= y <=> !(x < y)). Reproduire cette boîte de dialogue pour plusieurs classes est à la fois fastidieux et sujet aux erreurs. Les modèles boost/operators.hpp aident en générant des opérateurs pour vous au niveau de l'espace de noms en fonction d'autres opérateurs que vous avez définis dans votre classe.

1voto

Prithwish Jana Points 85

La réponse est claire NO. Il n'y a pas de moyen implicite. Les classes C++ permettent de surcharger les opérateurs. Donc, votre idée selon laquelle logiquement, if !(a < b) and !(b < a) signifie a == b. est correcte. Et, vous pouvez surcharger les opérateurs comme ci-dessous. Par exemple, une classe Fraction:

class Fraction {
    int num;
    int denom;
    . . .
    public:
    . . .
    bool operator < (const Fraction &other) {
        if ((this->num * other.denom) < (this->denom * other.num))
            return false;
        else
            return true;
       }
       bool operator == (const Fraction &other) (
           if (!(*this < other) && !(other < *this)) {
               return true;
           else
               return false;
       }
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X