Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
1 / 1 / 2
Регистрация: 10.10.2014
Сообщений: 62

Перегрузка ++ и --

09.11.2014, 14:57. Показов 1848. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня было задание:
Напишите программу работы со временем, в которой используются перегруженные операции ++ и --, которые работают в постфиксной и префиксной форме записи и возвращают значение. Дополните функцию main, чтобы протестировать эти операции.
Программу написала, все работает. Сказали, чтобы я изменила процедуры класса, где и происходит сама перегрузка, чтобы показать, чем отличаются формы постфикс и префикс. Не знаю как нужно именно исправить.

Добавлено через 40 секунд
Сама программа:

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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;
class time
{
    int chas;
    int min;
    int sec;
public:
    time ()
    {
        chas=0;
        min=0;
        sec=0;
    }
    ~time()
    {
    }
    time& operator ++ ()
    {
        cout<<"префикс ++"<<"\n";
    
        sec=sec+1;
            if(sec>=60)
        {
            sec=sec-60;
            min=min+1;
        }
            return *this;
    }
    time& operator ++ (int)
    {
        cout<<"постфикс ++"<<"\n";
        sec=sec+1;
        if(sec>=60)
        {
            sec=sec-60;
            min=min+1;
        }
        return *this;
    }
    time& operator -- ()
    {
        cout<<"префикс --"<<"\n";
        if(sec==0)
        {
            cout<<"Ошибка!";
        }
        else
        {
            sec=sec-1;
        }
        return *this;
        
    }
    time& operator -- (int)
    {
        cout<<"постфикс --"<<"\n";
        if(sec==0)
        {
            cout<<"Ошибка!";
        }
        else
        {
            sec=sec-1;
        }
        return *this;
    }
    void show()
    {
        cout<<"Время: "<<chas<<" Часов "<<min<<" минут "<<sec<<" секунд "<<"\n";
    }
};
void main()
{
    setlocale (0, "");
    
    int vyb;
    time t,t1;
    t.show();
    for(;;)
    {
        cout<<"Введите: 1 - постфикс ++, 2 - префикс ++, 3 - постфикс --, 4 - префикс --"<<"\n";
        cin>>vyb;
        switch (vyb)
        {
        case 1: 
            //t++;
            t1=t++;
            break;
        case 2: 
            //++t;
            t1=++t;
            break;
        case 3:
            t--;
            t1=t--;
            break;
        case 4: 
            --t;
            t1=--t;
            break;
        }
        t.show();
        t1.show();
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.11.2014, 14:57
Ответы с готовыми решениями:

Перегрузка в виде метода VS Перегрузка в виде функции друг
Привет! Собственно сабж: В каких случаях используется перегрузка в виде метода, а когда в виде функции друг? Добавлено через 4...

Множественное наследование, Перегрузка функций, Перегрузка операторов, Использование дружественных функций и классов, Использование шаблонов классов
Здравствуйте!!! Я бы хотел попросить помоч решить...ну или скинуть примеры таких задач, если вдруг у вас они завалялись на компе или...

С++. Перегрузка
Нужна помощь! Буду рада любым идеям! Надо написать программу, которая перегружает операцию «меньше чем» (&lt;) в классе Distance для...

7
2 / 2 / 2
Регистрация: 25.10.2014
Сообщений: 48
09.11.2014, 14:58
Скинь задание (номер и главу). Это же Лафоре?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
09.11.2014, 15:16
С какой стати они будут отличаться, если их код одинаковый:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
time& operator ++ ()
    {
        cout<<"префикс ++"<<"\n";
    
        sec=sec+1;
            if(sec>=60)
        {
            sec=sec-60;
            min=min+1;
        }
            return *this;
    }
    time& operator ++ (int)
    {
        cout<<"постфикс ++"<<"\n";
        sec=sec+1;
        if(sec>=60)
        {
            sec=sec-60;
            min=min+1;
        }
        return *this;
    }
Поменяйте что-нибудь, а потом попробуйте их вызвать:
C++
1
2
3
time t1;
cout << ++t1;
cout << t1++;
0
2 / 2 / 2
Регистрация: 25.10.2014
Сообщений: 48
09.11.2014, 15:30
Лучший ответ Сообщение было отмечено Backer как решение

Решение

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
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
using namespace std;
class time
{
    int chas;
    int min;
    int sec;
public:
    time()
    {
        chas = 0;
        min = 0;
        sec = 0;
    }
    time(int hrs, int mn, int sc) : chas(hrs), min(mn), sec(sc){}
    time& operator ++ (int){
        return time(chas, min, sec++);
    }
    time& operator ++ (){
        return time(chas, min, ++sec);
    }
    void show()
    {
        while (sec > 59){
            sec -= 60;
            min++;
        }
        while (min > 59){
            min -= 60;
            chas++;
        }
        cout << "time: " << chas << " hrs " << min << " mn " << sec << " sec " << "\n";
    }
};
 
int main(){
    time t1(0, 59, 59), t2;
    t2 = t1++;
    t2.show();
    t1.show();
    return 0;
}
Дальше по аналогии.
zss прав, разберитесь в чём разница постфиксной и префиксной формы записи.
1
1 / 1 / 2
Регистрация: 10.10.2014
Сообщений: 62
09.11.2014, 22:26  [ТС]
А что именно нужно поменять?
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,246
09.11.2014, 22:36
Так Вы же проектировщик класса - Вам и решать, что менять.
Вот kroak, предложил по разному менять sec.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13182 / 6818 / 1821
Регистрация: 18.10.2014
Сообщений: 17,255
09.11.2014, 22:57
Цитата Сообщение от Backer Посмотреть сообщение
Не знаю как нужно именно исправить.
Нужно, чтобы постфиксные операторы возвращали старое значение времени.

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

C++
1
2
3
4
5
6
time operator ++ (int)
{
  time old_time = *this; // Сохраняем старое значение
  ++*this;               // Вызываем префиксный оператор
  return old_time;       // Возвращаем старое значение
}
и все.

Заметьте, что постфиксные операторы не могут возвращать ссылку на объект. Они возвращают копию старого значения.

Добавлено через 17 минут
Цитата Сообщение от kroak Посмотреть сообщение
C++
1
2
3
time& operator ++ (int){
* * * * return time(chas, min, sec++);
 }
Ну это разумеется работать не будет.

Во-первых, это даже не скомпилируется из-за попытки вернуть временный объект по ссылке (надеюсь это опечатка).

Во-вторых, конструктор не выполняет нормализации значения времени, т.е. первод 60, 61, 63 и т.д. секунд в минуты не делает. Отлов переполнения секунд и минут реализован внутри операторов, вследствие чего реализовывать постфиксные операторы лучше именно так, как показал я.
1
1 / 1 / 2
Регистрация: 10.10.2014
Сообщений: 62
09.11.2014, 23:03  [ТС]
В чем разница между префиксной и постфиксной форме я знаю, просто не знала как это показать. Спасибо Вам большое!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.11.2014, 23:03
Помогаю со студенческими работами здесь

перегрузка
всем привет) мне нужна помощь)я пытаюсь научиться программировать на с++. вот первая проблема которая возникла у меня. написал программу...

перегрузка []
Как перегрузить operator так, чтобы когда я модифицировал массив то вызывалась простая версия, а когда просто выводил то const версия? ...

Перегрузка *
Есть такой класс: class CMatrix{ valarray&lt;valarray&lt;double&gt; &gt; matrix; public: CMatrix operator* (const CMatrix &amp;M); }; ...

Перегрузка.
Всем привет. Вот, попросили помочь, кому не сложно. Сам код: #ifndef OTREZOK_H #define OTREZOK_H #include &lt;iostream&gt;...

перегрузка <<, >>, []
правильно ли я перегрузил &gt;&gt;, &lt;&lt;, !?? у меня такое ощущение что неправильно, если всатвил стороку ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru