Как сравнить два объекта (вызывающий объект и параметр) в классе?

Я пишу класс "Даты" для присвоения, и я испытываю затруднения при выполнении одного функций.

Это - заголовочный файл для класса.

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)

Заранее спасибо!

6
задан n-2r7 3 February 2010 в 19:19
поделиться

7 ответов

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() - просто проверьте другие ответы. Он довольно прост и читабельный, но точно соответствует вашей спецификации.

12
ответ дан 8 December 2019 в 02:26
поделиться

Вот как я мог бы реализовать вашу функцию сравнения, хотя формат требует времени, чтобы привыкнуть:

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 выбрала другой подход.

8
ответ дан 8 December 2019 в 02:26
поделиться

в общедоступную область класса

bool operator==(const Date& rhs) const {
    return
       year == rhs.year
       && month == rhs.month
       && day == rhs.day
    ;
}
6
ответ дан 8 December 2019 в 02:26
поделиться

Сравните объект по содержанию , т.е. в вашем случае даты равны дня, месяц и год равны (и, возможно, формат - в зависимости от вашей семантики).

Кроме того, C ++ уже включает прекрасное средство для сравнения объектов: operator == , которое позволяет писать более понятный код, чем вызов метода Compare .

Кстати, позаботьтесь об этом:

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

Если условие истинно, будет выполнена строка cout . return будет выполнен, даже если условие ложно.

4
ответ дан 8 December 2019 в 02:26
поделиться

Семантика || 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;
}
4
ответ дан 8 December 2019 в 02:26
поделиться

Вы не можете сделать 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();
      }
   }
}
0
ответ дан 8 December 2019 в 02:26
поделиться

Чтобы использовать оператор == для определяемых пользователем типов, вы должны его реализовать. Кроме того, ваша функция сравнения должна быть помечена как константная функция-член:

class Date
{
...
int Compare(const Date& d) const;     

bool operator==(const Date& rhs) const
{
    return 0 == Compare(rhs);
}
3
ответ дан 8 December 2019 в 02:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: