9
votes

Comment comparer deux objets (l'objet d'appel et le paramètre) dans une classe?

J'écris une classe "date" pour une mission et j'ai du mal à en faire l'une des fonctions.

Ceci est le fichier d'en-tête de la classe. p> xxx pré>

la fonction membre J'essaie de faire est la fonction Int comparer (Const Date & D). J'ai besoin de cette fonction pour comparer deux objets de date (l'objet appelant et le paramètre), et devrait revenir: -1 si l'objet appelant vient en premier chronologiquement, 0 si les objets sont la même date et 1 si l'objet de paramètre Vient d'abord chronologiquement. P>

J'ai essayé de faire une déclaration simple si la déclaration avec l'opérateur == mais je reçois des erreurs. P>

  if (d1 == d2)
     cout << "The dates are the same";
     return (0);


0 commentaires

8 Réponses :


6
votes

dans la zone de la classe xxx


1 commentaires

Notez que la méthode est Const. Votre méthode Comparer () (et autres) devrait être constituée aussi. Si votre comparaison () serait constant, je pourrais l'appeler de l'opérateur == () :-)



4
votes

comparer l'objet par le contenu , c'est-à-dire dans votre cas, les dates sont égales par jour, mois et année sont égales (et peut-être format - en fonction de votre sémantique).

En outre, C ++ comprend déjà une excellente installation de comparaison d'objets: opérateur == qui permet de rédiger un code plus claire que d'appeler un comparer

Au fait, prenez soin de ceci: xxx

si la condition est vraie, la ligne cout sera exécutée. Le retour sera exécuté même si la condition est fausse.


0 commentaires

14
votes
bool operator == (const Date& d) const {
   return !Compare(d);
}

bool operator < (const Date& d) const {
  return Compare(d)<0;   
}

... // consider using boost::operators

1 commentaires

Merci, c'est exactement ce que j'essayais de faire.



0
votes

Vous ne pouvez pas faire d1 === D2, car je crois que cela compare les adresses de mémoire (n'a pas fait C ++ depuis un moment).

Ce que vous devez faire est d'écrire une fonction comparera chaque membre de votre classe de date et retournera un nombre négatif, 0 ou un nombre positif. Signifie négatif inférieur, 0 signifie la même chose et des moyens positifs plus grands. P>

Par exemple, en Java: P>

public int compareTo(Date date) {
  int returnValue = 0;

   returnValue = this.getYear() - date.getYear();

   if(returnValue == 0) {
      returnValue = this.getMonth() - date.getMonth();

      if(returnValue == 0) {
         returnValue = this.getDay() - date.getDay();
      }
   }
}


7 commentaires

d1 == D2 ne compile pas à moins que l'opération soit implémentée quelque part. Dans ce cas, ce n'est pas mis en œuvre.


L'OP explicitement indique "... la fonction doit être appelée comme ceci d1.compare (D2)", ce qui signifie que ni d1 ni d2 ne sont des adresses de mémoire (pointeurs). La comparaison des adresses de mémoire dans ce cas impliquerait quelque chose comme "& d1 == & d2", pas "D1 == D2". Créer un opérateur d'égalité comme la seule @notinlist Posté fournit la sémantique D1 == D2 souhaitée.


Merci pour le pointeur "This", je n'ai pas pensé à cela.


@Void Ah, bon point. Comme je l'ai dit, je n'ai pas fait C ++ depuis un moment. J'étais à Java-terre où tout est une référence / pointeur :)


Cette mise en œuvre de comparaisto n'est pas une bonne stratégie générale, à cause de débordement. De toute évidence, les dates ne vont pas déborder, vous pouvez donc vous en sortir, mais considérez si ceci.getyear () est int_max et date.getyear () est -1 . Puis lhs> rhs, mais lhs - rhs <0.


J'espère qu'il y a une fonction de validation qui garantit que l'attribut d'année n'est pas chez Int_max. Mais oui, ce n'est probablement pas une stratégie généralement bonne.


Oui, ça va pour les dates tant que vos dates ne vont pas absurdement loin dans le futur.



3
votes

Pour utiliser l'opérateur == pour des types définis par l'utilisateur, vous devez la mettre en œuvre. De plus, votre fonction de comparaison doit être marquée en tant que fonction Const membre: xxx


0 commentaires

4
votes

La sémantique de C ++ 'S || code> Faites cela un peu encombré:

static inline int cmp(int a, int b)
{
  return a < b ? -1 : a == b ? 0 : 1;
}

int Date::Compare(const Date& d)
{
  int result;
  (result = cmp(year, d.year))     ||
    (result = cmp(month, d.month)) ||
      (result = cmp(day, d.day));

  return result;
}


1 commentaires

Mais si vous devez vraiment commencer le nom avec un soulignement, assurez-vous que ce n'est pas dans l'espace de noms global - ce n'est pas autorisé.



8
votes

Voici comment puis-je implémenter votre fonction de comparaison, bien que le format prend un moment pour s'habituer à:

template<typename T>
int Compare(T a, T b) {
    if (a < b) return -1;
    if (b < a) return 1;
    return 0;
}

int Date::Compare(const Date& d) const {
    int a = Compare(year, d.year);
    if (a == 0) a = Compare(month, d.month);
    if (a == 0) a = Compare(day, d.day);
    return a;
}


1 commentaires

Merci, c'est une excellente explication.



0
votes
class Temp {

public:
       Temp(const char* str) {
         this->str = str;
         printf("Temp [%s] is created\n", this->str);
       }

       ~Temp() {
         printf("Temp [%s] is deleted\n", this->str);
       }

       bool operator == (const Temp& a) const {
         return this->str == a.str;
       }

private:
       const char* str = new char[10];
}

int main() {

   Temp test1{"Hello1"};
   Temp test2{"Hello2"};
   (test1 == test2) ? printf("Equals") : printf("Non equals");

   return 0;
}

0 commentaires