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

Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами. - C++

Восстановить пароль Регистрация
 
Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
02.06.2013, 17:54     Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами. #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
class CSemCalendar
{
    int m_year;
    int m_month;
    int m_day;
    int m_month_days[12];
 
    int SetDay(int);
    int SetMonth(int);
    int SetYear(int);
 
public:
        CSemCalendar();
        ~CSemCalendar();
 
        void GetDate(char *buf);
        int GetDay();
        int GetMonth();
        int GetYear();
 
        int SetDate(int AYear, int AMonth, int ADay);
        int SetDate(char *buf);
 
        void AddDay(int);
        int Week(int,int,int);
 
        //для Перегрузки операторов
         void operator-(CSemCalendar &t);
         friend CSemCalendar operator>>(CSemCalendar &t, CSemCalendar &d);  
 
};
Вот "механизм"

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
void CSemCalendar::operator-(CSemCalendar& t)
{
        m_day=m_day-m_day;
        m_month=m_month-m_month;
        m_year=m_year-m_year;
    
}
 
CSemCalendar operator>>(CSemCalendar &t, CSemCalendar &d)
{
    int t1,t2,t3;
 
    
 
    t1=t.GetDay()-d.GetDay();
    t.SetDay(t1);
    t2=t.GetMonth()-d.GetMonth();
    t.SetMonth(t2);
    t3=t.GetYear()-d.GetYear();
    t.SetYear(t3);
 
    
 
    return t;
}
Вот main



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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
void main()
{
        setlocale(LC_ALL, "Russian");
        CSemCalendar semestr_1; 
        CSemCalendar semestr_N;
        CSemCalendar semestr_2;
                    
        
        int start_day, start_month, start_year;
        int qday, qmonth, qyear;
        int i=0;
        int ofday,ofmonth,ofyear;
        int ofday2,ofmonth2,ofyear2;
 
    while(1)
    {
        printf("Введите дату начала занятий\n");
        scanf("%d", &start_day);
        scanf("%d", &start_month);
        scanf("%d", &start_year);
        if(!semestr_1.SetDate(start_day, start_month, start_year))
        {
            printf("%d ", semestr_1.GetDay());
            printf("%d ", semestr_1.GetMonth());
            printf("%d ", semestr_1.GetYear());
            printf("\nIncorrect date\n");
            continue;
        }
        else break;
    
    }
        while(1)
    {
          printf("Введите дату для задания\n");
          scanf("%d", &qday);
          scanf("%d", &qmonth);
          scanf("%d", &qyear);
          if(!semestr_N.SetDate(qday, qmonth, qyear))
          {
            printf("The date You have typed is invalid.\n");
            continue;
          }
 
        /*  if(!semestr_N.Week(qday, qmonth, qyear))
              printf("\nНижняя неделя");
          else
          {  printf("\nВерхняя неделя");  }
 
          ofday2=semestr_N.GetDay();
          ofmonth2=semestr_N.GetMonth();
          ofyear2=semestr_N.GetYear();
         
          while(1)
          {   
                    semestr_1.AddDay(7);
                    i++;
                    ofday=semestr_1.GetDay();
                    ofmonth=semestr_1.GetMonth();
                    ofyear=semestr_1.GetYear();
                    if((ofday>=ofday2)&&(ofmonth>=ofmonth2))
                        break;
          }*/
                    
            printf("\n%d\n\n", i);
 
            printf("Текущая дата: \n");
            printf("%d.%d.%d\n", semestr_N.GetDay(), semestr_N.GetMonth(), semestr_N.GetYear());
            printf("Задание: отнять текущую дату \n");
            semestr_N-semestr_N;
            printf("%d.%d.%d\n", semestr_N.GetDay(), semestr_N.GetMonth(), semestr_N.GetYear());
            printf("Разница между 2 датами : ");
            semestr_N>>semestr_1;
            printf("%d.%d.%d\n", semestr_N.GetDay(), semestr_N.GetMonth(), semestr_N.GetYear());
            printf("%d.%d.%d\n", semestr_1.GetDay(), semestr_1.GetMonth(), semestr_1.GetYear());
 
          getch();
       
            
    }
}
то что в комментах для прошлого задания, это можно не учитывать.

Операция >> не выполняет ничего...

Set и Get методы я не писал сюда, уверяю, что они работают Если понадобятся - скину.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2013, 17:54     Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами.
Посмотрите здесь:

Подсчитать разницу в днях между 2 датами C++
Программа, определяющая разницу в сутках между двумя датами C++
Вычислить разницу в днях между двумя заданными датами C++
C++ надо изменить его так чтобы он находил сумму любых введёных чисел и при вводе числа 0 программа завершалась
C++ Оператор суммирования (классы, перегрузка операторов)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
02.06.2013, 19:04     Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами. #2
Если не приглядываться, у тебя тут куча ляпов: почему, например, оператор >> меняет значение первого аргумента?
Плюс, это, может, и старческое брюзжание, но какого хрена оператор перенаправления выполняет не соответствующую его семантике операцию?)))
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.06.2013, 20:08     Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами. #3
Praud, Вы бы для начала разобрались на C пишете или на C++. Потом, зачем приводить закоментированный код, если он не несет смысловой нагрузки?
Цитата Сообщение от Praud Посмотреть сообщение
Возникли проблемы с инкапсуляцией (это мое мнение)
Конкретнее. В чем Вы видите проблему?

Не по теме:

Цитата Сообщение от ITcrusader Посмотреть сообщение
но какого хрена оператор перенаправления выполняет не соответствующую его семантике операцию?)))
Тем более, что это оператор сдвига вправо

Praud
7 / 7 / 3
Регистрация: 25.02.2013
Сообщений: 233
03.06.2013, 00:00  [ТС]     Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами. #4
Цитата Сообщение от ITcrusader Посмотреть сообщение
Если не приглядываться, у тебя тут куча ляпов: почему, например, оператор >> меняет значение первого аргумента?
Плюс, это, может, и старческое брюзжание, но какого хрена оператор перенаправления выполняет не соответствующую его семантике операцию?)))
И какие же у меня ляпы?

Задание у меня такое
"В соответствии с вариантом задания перегрузить два оператора.
Перегрузка операторов осуществить для программы по лабораторной работе "Инкапсуляция. Создание класса". Для реализации операторов использовать готовые методы.

Продемонстрировать работу перегруженных операторов"

>> бинарный дружественный оператор разница между двумя датами
- унарный оператор класса отнять текущую дату

С оператором - я справился, а с >> не могу.
Может запись semestr_N>>semestr_1 неверная, может и метод неверный.
Я хочу чтобы мне помогли найти что неверно.
Нужно из semestr_N отнимать semestr_1

Добавлено через 12 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
Praud, Вы бы для начала разобрались на C пишете или на C++.
Если вас смутили printf и scanf, то так было в примере и переписывать я все не стал и считаю что это вообще не суть.
BAADF00D
Заблокирован
03.06.2013, 00:06     Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами. #5
C++
1
#include <ctime>
не?
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.06.2013, 10:43     Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами. #6
Цитата Сообщение от Praud Посмотреть сообщение
C++
1
void CSemCalendar::operator-(CSemCalendar& t)
Цитата Сообщение от Praud Посмотреть сообщение
- унарный оператор класса отнять текущую дату
Вы, видимо, забыли, что нестатическая функция-член принимает неявный аргумент this. В данном случае Ваш operator- является бинарным.
А вот для разности дат вместо operator>> (который интуитивно для этого совсем не подходит) логичнее было бы использовать бинарный operator-.

Вы так и не ответили на вопрос: "В чем Вы видите проблему с инкапсуляцией?"

Цитата Сообщение от BAADF00D Посмотреть сообщение
#include <ctime>
не?
ТС нужно для обучения, поэтому предположу, что готовые решения не подходят: ctime, std::chrono и пр.

Цитата Сообщение от Praud Посмотреть сообщение
И какие же у меня ляпы?
C++
1
2
3
4
5
6
void CSemCalendar::operator-(CSemCalendar& t)
{
        m_day=m_day-m_day;
        m_month=m_month-m_month;
        m_year=m_year-m_year;
}
Что по-Вашему здесь происходит? Почему бы не написать просто:
C++
1
m_day = m_month = m_year = 0;
И даже если бы Вы не забыли указать объект t, то просто вычесть одну дату из другой так нельзя. Представьте, например, что будет на стыке мясяцев.
Yandex
Объявления
03.06.2013, 10:43     Перегрузка операторов. Инкапсуляция. Сделать так, чтобы оператор >> находил разницу между датами.
Ответ Создать тему
Опции темы

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