Я пишу класс "Даты" для присвоения, и я испытываю затруднения при выполнении одного функций.
Это - заголовочный файл для класса.
class Date
{
public:
Date(); // Constructor without parameters
Date(int m, int d, int y); // Constructor with parameters.
// accessors
int GetMonth(); // returns the size of the diamond
int GetDay();
int GetYear();
// mutators
bool Set(int m, int d, int y);
bool SetFormat(char f);
// standard input and output routines
void Input();
void Show();
void Increment(int numDays = 1);
int Compare(const Date& d);
private:
int month, // month variables
day, // day variable
year; // year variable
char format;
};
Функция членства, которую я пытаюсь сделать, является интервалом, Сравнивают (константа Date& d) функцию. Я нуждаюсь в этой функции для сравнения двух объектов Даты (вызывающий объект и параметр), и должен возвратиться:-1, если вызывающий объект на первом месте хронологически, 0, если объекты являются той же датой, и 1, если объект параметра на первом месте хронологически.
Я попытался делать простое, если оператор с == оператор, но я получаю ошибки.
if (d1 == d2)
cout << "The dates are the same";
return (0);
После того, как объекты создаются, функция должна быть вызвана как этот d1. Сравните (d2)
Заранее спасибо!
int Date :: Compare (const Date& d) {
if (year<d.year) {
return -1;
}
else if (year>d.year) {
return 1;
}
else if (month<d.month) {
return -1;
}
else if (month>d.month) {
return 1;
}
// same for day
return 0;
}
Обычно Вы также хотите предоставить перегруженные операторы сравнения, например (также в определении класса):
bool operator == (const Date& d) const {
return !Compare(d);
}
bool operator < (const Date& d) const {
return Compare(d)<0;
}
... // consider using boost::operators
PS: Существуют более умные реализации Compare()
- просто проверьте другие ответы. Он довольно прост и читабельный, но точно соответствует вашей спецификации.
Вот как я мог бы реализовать вашу функцию сравнения, хотя формат требует времени, чтобы привыкнуть:
int Date::Compare(const Date& d) const {
return
(year < d.year) ? -1 :
(year > d.year) ? 1 :
(month < d.month) ? -1 :
(month > d.month) ? 1 :
(day < d.day) ? -1 :
(day > d.day) ? 1 :
0;
}
Или, возможно:
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;
}
Я бы не стал ' t используйте operator ==
в Compare, хотя ответы, рассказывающие вам, как реализовать operator ==
, подходят, если вы тоже этого хотите. Причина в том, что operator ==
явно должен будет смотреть на те же поля, что и compare, и если он вернет false, тогда Compare снова будет выполнять очень похожую работу. Эффективность, вероятно, не проблема, но она дублирует логику.
Как бы то ни было, идиоматический C ++ должен реализовать operator <
и, возможно, также согласованный operator ==
и operator>
, а не все -в-одном Функция сравнения. Операторы - это то, что стандартные алгоритмы используют для поиска и сортировки, а все остальное следует. Java выбрала другой подход.
в общедоступную
область класса
bool operator==(const Date& rhs) const {
return
year == rhs.year
&& month == rhs.month
&& day == rhs.day
;
}
Сравните объект по содержанию , т.е. в вашем случае даты равны дня, месяц и год равны (и, возможно, формат
- в зависимости от вашей семантики).
Кроме того, C ++ уже включает прекрасное средство для сравнения объектов: operator ==
, которое позволяет писать более понятный код, чем вызов метода Compare
.
Кстати, позаботьтесь об этом:
if (d1 == d2)
cout << "The dates are the same";
return (0);
Если условие истинно, будет выполнена строка cout
. return
будет выполнен, даже если условие ложно.
Семантика ||
C ++ делает это немного загроможденным:
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;
}
Вы не можете сделать d1 === d2, потому что я считаю, что он сравнивает адреса памяти (давно не делал C++).
Нужно написать функцию, которая будет сравнивать каждый член вашего класса Date и возвращать отрицательное число, 0, или положительное число. Отрицательное означает меньшее, 0 означает то же самое, а положительное - большее.
Например, на Java:
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();
}
}
}
Чтобы использовать оператор == для определяемых пользователем типов, вы должны его реализовать. Кроме того, ваша функция сравнения должна быть помечена как константная функция-член:
class Date
{
...
int Compare(const Date& d) const;
bool operator==(const Date& rhs) const
{
return 0 == Compare(rhs);
}