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> 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);
8 Réponses :
dans la zone de la classe code> pré> xxx pré> p>
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 == () :-)
comparer l'objet par le contenu em>, c'est-à-dire dans votre cas, les dates sont égales par jour, mois et année sont égales (et peut-être En outre, C ++ comprend déjà une excellente installation de comparaison d'objets: Au fait, prenez soin de ceci: p> si la condition est vraie, la ligne format code> - en fonction de votre sémantique).
opérateur == code> qui permet de rédiger un code plus claire que d'appeler un
comparer p>
cout code> sera exécutée. Le retour code> code> sera exécuté même si la condition est fausse. P> p>
bool operator == (const Date& d) const { return !Compare(d); } bool operator < (const Date& d) const { return Compare(d)<0; } ... // consider using boost::operators
Merci, c'est exactement ce que j'essayais de faire.
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(); } } }
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 () code> est int_max et
date.getyear () code> 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.
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:
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;
}
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é.
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; }
Merci, c'est une excellente explication.
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; }