Форум программистов, компьютерный форум CyberForum.ru

Перегруженная функция сравнения двух дат - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 13:59     Перегруженная функция сравнения двух дат #1
Как сократить функцию которая сравнивает две даты?
Получилось кое-как, да и еще предупреждение показывает, что значение возвращается не при всех путях выполнения

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class CDate
{
public:
    explicit CDate(int day=1, int month=1, int year=2000);
    explicit CDate(const CDate &copy);
 
    bool operator<(const CDate &right);
    bool operator<=(const CDate &right);
 
private:
    int mDay, mMonth, mYear;
};
 
 
 
bool CDate::operator<(const CDate &right)
{
    if (mYear<right.mYear) return true;             // год меньше
    
    if (mYear==right.mYear)                         // года одинаковые
    {
        if (mMonth<right.mMonth) return true;
 
        if (mMonth==right.mMonth)                   // одинаковый год + одинаковый месяц
        {
            if (mDay<right.mDay) return true;
            if (mDay>=right.mDay) return false;
        }
 
        if (mMonth > right.mMonth) return false;
    }
 
    if (mYear > right.mYear) return false;          // год больше
}
 
 
bool CDate::operator<=(const CDate &right)
{
    if (mYear<right.mYear) return true;
 
    if (mYear==right.mYear)                         // одинаковые года
    {
        if (mMonth<right.mMonth) return true;
 
        if (mMonth==right.mMonth)                   // одинаковые года + одинаковые месяцы
        {
            if (mDay<=right.mDay) return true;
            else return false;
        }
 
        if (mMonth>right.mMonth) return false;
    }
 
    if (mYear>right.mYear) return false;
}


warning C4715: CDate::operator<: значение возвращается не при всех путях выполнения
warning C4715: CDate::operator<=: значение возвращается не при всех путях выполнения

Может есть более простой способ
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.07.2013, 13:59     Перегруженная функция сравнения двух дат
Посмотрите здесь:

C++ Функция для сравнения двух символьных последовательностей
перегруженная функция C++
перегруженная функция sqrt C++
C++ Перегруженная функция
функция для сравнения двух массивов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.07.2013, 14:00     Перегруженная функция сравнения двух дат #2
Я бы предложил перевести все в одни единицы измерения и уже потом сравнить.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:03  [ТС]     Перегруженная функция сравнения двух дат #3
0x10, а что за единицы измерения?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.07.2013, 14:05     Перегруженная функция сравнения двух дат #4
В данном случае пересчитал бы все в дни.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
14.07.2013, 14:05     Перегруженная функция сравнения двух дат #5
Цитата Сообщение от BigLow Посмотреть сообщение
а что за единицы измерения?
В данном случае - дни.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.07.2013, 14:07     Перегруженная функция сравнения двух дат #6
BigLow, и еще нюанс: всю логику достаточно написать в единственном операторе - <. Остальные (>, <=, >=) пишутся уже через него.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:08  [ТС]     Перегруженная функция сравнения двух дат #7
Цитата Сообщение от 0x10 Посмотреть сообщение
В данном случае пересчитал бы все в дни.
Цитата Сообщение от Tulosba Посмотреть сообщение
В данном случае - дни.
это вы имеете ввиду, саму дату представить как количество дней от какого-то числа?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.07.2013, 14:11     Перегруженная функция сравнения двух дат #8
BigLow, типа того.
И пока помню - такие операторы привычнее видеть снаружи класса, т.е. чтобы они принимали два аргумента: левый и правый.

Добавлено через 1 минуту
BigLow, А можно и схалтурить: сформировать две строки вида YYYYMMDD и сравнить лексикографически. (хотя казалось бы при чем тут строки, можно и числами)
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:16  [ТС]     Перегруженная функция сравнения двух дат #9
0x10, насчет строк - это хорошая идея спасибо
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
14.07.2013, 14:17     Перегруженная функция сравнения двух дат #10
Цитата Сообщение от BigLow Посмотреть сообщение
C++
1
2
if (mDay<=right.mDay) return true;
else return false;
C++
1
return mDay <= right.mDay;
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.07.2013, 14:18     Перегруженная функция сравнения двух дат #11
year * 10000 + month * 100 + day и фиг с ними.
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:25  [ТС]     Перегруженная функция сравнения двух дат #12
Цитата Сообщение от 0x10 Посмотреть сообщение
year * 10000 + month * 100 + day
а если из этого числа нужно будет узнать день, месяц или год, то каким способом это проделать?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.07.2013, 14:33     Перегруженная функция сравнения двух дат #13
Зачем? Я не предлагаю его хранить, только вычислить для сравнения дат. (хотя в обратной операции нет ничего хитрого)
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:43  [ТС]     Перегруженная функция сравнения двух дат #14
а я с начала подумал, что саму дату в таком виде хранить.
все, понял как сделать. вот что получилось:
C++
1
2
3
4
5
6
7
bool CDate::operator<(const CDate &right)
{
    size_t n1 = mYear*10000 + mMonth*100 + mDay;
    size_t n2 = right.mYear*10000 + right.mMonth*100 + right.mDay;
 
    return n1<n2;
}
всего 3 строчки кода
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.07.2013, 14:44     Перегруженная функция сравнения двух дат #15
И на остальные операторы придется по одной строчке.
Тут есть еще пара нюансов: в частности, такие методы не будут работать с константными объектами. (чтобы наверняка - как уже говорил, лучше сделать внешними функциями).
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 14:49  [ТС]     Перегруженная функция сравнения двух дат #16
Цитата Сообщение от 0x10 Посмотреть сообщение
такие методы не будут работать с константными объектами.
будут, если функцию сделать const
C++
1
2
3
4
5
6
7
bool CDate::operator<(const CDate &right) const
{
    size_t n1 = mYear*10000 + mMonth*100 + mDay;
    size_t n2 = right.mYear*10000 + right.mMonth*100 + right.mDay;
 
    return n1<n2;
}
да и привык уже таким способом перегружать, т.е. внутри класса
0x10
14.07.2013, 14:55
  #17

Не по теме:

В данном случае мб и все равно, но в будущем вероятно найдется кто-нибудь, кто стукнет по рукам)
Я, например, не вижу причин почему в выраженях a < b, a == b, a > b левый аргумент "главнее" и должен быть объектом, у которого вызывается метод. Мы сравниваем два равноправных объекта. Не правый с левым, а два между собой.
Но это я уже на твое усмотрение оставляю)

Jupiter
14.07.2013, 15:00
  #18

Не по теме:

Цитата Сообщение от BigLow Посмотреть сообщение
да и привык
привык - так отвыкай. 0x10 дело говорит.

BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
14.07.2013, 15:33  [ТС]     Перегруженная функция сравнения двух дат #19
Цитата Сообщение от 0x10 Посмотреть сообщение
Мы сравниваем два равноправных объекта. Не правый с левым, а два между собой.
Цитата Сообщение от Jupiter Посмотреть сообщение
привык - так отвыкай. 0x10 дело говорит.
хорошо прислушаюсь к совету

Добавлено через 24 минуты
Цитата Сообщение от 0x10 Посмотреть сообщение
всю логику достаточно написать в единственном операторе - <. Остальные (>, <=, >=) пишутся уже через него.
не могли бы пояснить поточнее? в операторах (>, >=, <=) используется только (<)? никаких других операторов в нем нет?
просто я сейчас пытаюсь реализовать это для остальных, но не получается

для ">=" пишу return !(*this<right); а вот с другими проблема
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2013, 15:39     Перегруженная функция сравнения двух дат
Еще ссылки по теме:

Функция сравнения двух чисел C++
C++ Перегруженная функция
C++ Перегруженная функция

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
14.07.2013, 15:39     Перегруженная функция сравнения двух дат #20
Там все так просто, аж смешно)
Если есть operator<(a, b), то легко определить operator>(a, b). Когда А больше В? Тогда, когда В меньше А. А оператор меньше уже определен.
operator>(a, b) { return b < a; }
Ну и оставшийся <= по аналогии
Yandex
Объявления
14.07.2013, 15:39     Перегруженная функция сравнения двух дат
Ответ Создать тему
Опции темы

Текущее время: 12:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru