логические операции, перегружающие внутри классов в С++, и операторы if для дат внутри класса

Я использую этот код в своем предыдущем вопросе: Добавление года реализация на С++ с использованием класса

Я хочу использовать оператор if для проверки дат таким образом, чтобы, если день был 31, он возвращался к 0, а месяц увеличивался на единицу. Я даже пытался написать другой метод и использовать его внутри операции +, но это тоже не удалось, потому что я увеличиваю день в функции возврата внутри объявления операции. В результате его необходимо будет увеличить перед первой проверкой условий! но что, если число изначально было 31? нет месяца, в котором 32 дня!

Я пытался использовать его, но из-за моей реализации он не работал должным образом.

Мой другой вопрос заключается в том, что я пытаюсь использовать логическую проверку ссылок с операцией ==

Это то, что я сделал до сих пор:

bool operator==(const Date&) const;

bool Date::operator==(const Date& date) const
{
    if (day == date.day && monthnum == date.monthnum && year == date.year)
        return true;
    else return false;

}

но по какой-то причине, когда я пытаюсь проверить его в основном, говоря, например, date1 == date2, он не компилируется! я неправильно пишу?

«нет операции == соответствует этим операндам» это ошибка, которую я получаю, когда пытаюсь скомпилировать код


person rullzing    schedule 02.02.2014    source источник
comment
Какая у вас ошибка? Покажите главное пожалуйста   -  person Alexandru Barbarosie    schedule 03.02.2014
comment
Я не думаю, что задавать 2 отдельных вопроса в одном посте - хорошая идея. Как вы будете отмечать ответы, если два разных человека правильно ответят на два разных вопроса?   -  person Xyzk    schedule 03.02.2014
comment
никакая операция == не соответствует этим операндам Это ошибка, которую я получаю   -  person rullzing    schedule 03.02.2014


Ответы (1)


Я хочу использовать оператор if для проверки дат таким образом, чтобы, если день был 31, он возвращался к 0, а месяц увеличивался на единицу.

Это так же просто реализовать, как:

if (day == 31) {
    day = 0;
    monthnum++;
}

Я пытаюсь протестировать его в основном, говоря, например, date1==date2, он не компилируется! я неправильно пишу?

Да, вы объявляете бесплатную функцию operator==, а вам нужна функция-член. Внутри Date делаем:

class Date {
public:
    // ...
    bool operator==(const Date&) const;
    // ...
};

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

bool operator==(const Date& lhs, const Date& rhs) {
    return (lhs.day == rhs.day && lhs.monthnum == rhs.monthnum && lhs.year == rhs.year);
}

(Я удалил лишнюю пару if-else).


Компилятор заявляет, что «ни одна операция == не соответствует этим операндам». У меня просто есть этот код в моей основной: cout ‹‹ date1 == date2;

Да, вы должны сделать это вместо этого:

cout << (date1 == date2);

в противном случае компилятор читает следующее:

(cout << date1) == date2;
person Shoe    schedule 02.02.2014
comment
Я думаю, что функция, которую вы считали бесплатной, находится внутри класса, так как это реализация: bool Date::operator==(const Date& date) const - person Alexandru Barbarosie; 03.02.2014
comment
@AlexandruBarbarosie, я очень в этом сомневаюсь, учитывая, что он вызывает ошибку компиляции. - person Shoe; 03.02.2014
comment
Никто не знает, чем он занимается в основном. Если бы функция была свободна, Date::operator== также вызвала бы ошибку. - person Alexandru Barbarosie; 03.02.2014
comment
@AlexandruBarbarosie, думаю, мы увидим, когда ОП ответит. Я с радостью удалю этот ответ, если я ошибаюсь. - person Shoe; 03.02.2014
comment
Я использую первый код в своей программе, и он не компилируется. Я попробовал второй, и у меня все еще та же проблема. Компилятор утверждает, что ни одна операция == не соответствует этим операндам. У меня просто есть этот код в моей основной: cout ‹‹ date1 == date2; - person rullzing; 03.02.2014
comment
СПАСИБО ! Я не ожидал, что это произойдет. - person rullzing; 03.02.2014