Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Backer
1 / 1 / 2
Регистрация: 10.10.2014
Сообщений: 62
1

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

09.11.2014, 14:57. Просмотров 864. Ответов 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)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.11.2014, 14:57
Ответы с готовыми решениями:

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

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

Перегрузка new
Дайте примеры на перегрузку. #define n ... // Некая целая константа class a {...

Перегрузка в c++
Собственно для чего нужна перегрузка функций или операторов ?

перегрузка []
доброго времени суток.. суть задачи такова: есть класс матриц, матрица...

7
kroak
2 / 2 / 2
Регистрация: 25.10.2014
Сообщений: 43
09.11.2014, 14:58 2
Скинь задание (номер и главу). Это же Лафоре?
0
zss
Модератор
Эксперт С++
7360 / 6769 / 4281
Регистрация: 18.12.2011
Сообщений: 17,882
Завершенные тесты: 1
09.11.2014, 15:16 3
С какой стати они будут отличаться, если их код одинаковый:
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
kroak
2 / 2 / 2
Регистрация: 25.10.2014
Сообщений: 43
09.11.2014, 15:30 4
Лучший ответ Сообщение было отмечено 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
Backer
1 / 1 / 2
Регистрация: 10.10.2014
Сообщений: 62
09.11.2014, 22:26  [ТС] 5
А что именно нужно поменять?
0
zss
Модератор
Эксперт С++
7360 / 6769 / 4281
Регистрация: 18.12.2011
Сообщений: 17,882
Завершенные тесты: 1
09.11.2014, 22:36 6
Так Вы же проектировщик класса - Вам и решать, что менять.
Вот kroak, предложил по разному менять sec.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4800 / 2452 / 686
Регистрация: 18.10.2014
Сообщений: 4,220
09.11.2014, 22:57 7
Цитата Сообщение от 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
Backer
1 / 1 / 2
Регистрация: 10.10.2014
Сообщений: 62
09.11.2014, 23:03  [ТС] 8
В чем разница между префиксной и постфиксной форме я знаю, просто не знала как это показать. Спасибо Вам большое!!!
0
09.11.2014, 23:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.11.2014, 23:03

Перегрузка >>
Доброго времени суток. Есть учебный пример перегрузки операций &gt;&gt; и &lt;&lt;. ...

Перегрузка
И вот это не могу реализовать программно((.Помогите пожалуйста. Время...

Перегрузка
Класс - множество set. Дополнительно перегрузить следующие операции: -- удалить...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru