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

Перегрузка операторов - C++

Восстановить пароль Регистрация
 
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
24.09.2013, 00:34     Перегрузка операторов #1
Привет, ребят! Помогите разобраться с перегрузкой, а то преподы нынче и сами ничего не знают. Вот.
Имеем три файла (ну если кто захочет скомпилить): stud.h (сам класс и методы/функции), stud.cpp (соотв. их реализация), main.cpp (тут вызываю я методы/функции, создаю объекты).
Так вот, в stud.cpp (в самом конце, я там пометил) пытался перегрузить операторы префиксного и постфиксного сложения (но что-то некорректно работает marks[i]++ операция, т.е. она сразу складывает, а должна ж вроде как возвращать старое значение сначала). В общем, пытался по разному реализовать, но не выходит. Вот в общем и задание:
  • 1. ++object - увеличивает первую и вторую оценку на балл, аналогично и с object++, только третью и четвертую;
  • 2. с= a>b - сравниваем оценки двух студентов (у меня здесь это будет FIRST_TRY и SECOND_TRY), и выводим типа уху, этот #username# круче (хватит и самой перегрузки, остальное эт понятно ^^);
  • 3. a+=1; - переводим студента на следующий курс, если все оценки более 4-х (т.е. надо semester++).

В общем, как-то так...Буду благодарен вам с любой помощью. Ибо как реализовать такие перегрузки, вообще не пойму. На примере лучше получается
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
//stud.h (класс)
#ifndef _STUD_H_
#define _STUD_H_
 
using namespace std;
 
class Stud {
private:
    string surname;
    int semester;
    size_t marks[4];
 
    static size_t const min_semester = 1;
    static size_t const max_semester = 20;
    static size_t const min_mark = 0;
    static size_t const max_mark = 10;
 
public:
    Stud(): surname("<-unknown->"), semester(min_semester) { fill_n(marks, 4, min_mark); } 
    Stud(const Stud &St);
    ~Stud() {}
    void get();
    void set();
    friend void exam (Stud &St); 
    Stud& operator++(int);
    Stud& operator++();
};
 
#endif
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
// stud.cpp (реализация методов, функций, перегрузки)
#include <iostream>
#include <string>
#include <exception>
#include <algorithm>
#include <functional>
#include <cstdint>
 
#include "stud.h"
 
using namespace std;
 
void Stud::set() { //ввод фамилии и семестра 
    cout << "Фамилия студента ";
    cin >> surname;
    if (find_if(  surname.begin(), surname.end(), not1(ptr_fun(::isalpha))) != surname.end())
        throw runtime_error("Names can only contain letters.");
 
    do {
        cout << "Семестр студента ";
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
    } while (!(cin >> semester) || semester < min_semester || semester > max_semester );
}
 
void exam(Stud &St) { //ввод оценок (friend-функция)
    for (size_t i = 0; i < 4u; ++i) {
        do {
            cout << "Введите " << i + 1 << " оценку - ";
            cin.clear();
            cin.ignore(numeric_limits<streamsize>::max(), '\n');
        } while ( !(cin >> St.marks[i]) || St.marks[i] < St.min_mark || St.marks[i] > St.max_mark );
    }
    cout << "=======ВВОД ЗАКОНЧЕН=======" << endl;
}
 
 
void Stud::get() { //вывод объекта 
    cout << "Фамилия - " << surname << " " << endl;
    cout << "Оценки:" << endl;
    for (int i = 0; i < 4; i++)
        cout << "Оценка " << i + 1 << " равна " << marks[i] << endl;
    cout << "Семестр " << semester << endl;
    cout << "=====ВЫВОД ЗАКОНЧЕН========" << endl;
}
 
Stud::Stud(const Stud &St): surname(St.surname), semester(St.semester) { //копирование
    copy_n(St.marks, 4, marks);
}
 
/*Stud& operator++(Stud &St) {
    St.marks[0]++;
    St.marks[1]++;
    return St;
}
 
Stud operator++(Stud &St, int) {
    Stud oldValue(St.semester);
    St.semester--;
    return oldValue;
}
*/
 
Stud& Stud::operator++ () { //+
    cout << "====ПРЕФИКС====" << endl;
    ++marks[0];
    ++marks[1];
    return (*this);
}
 
Stud& Stud::operator++ (int) { //a++ - третья и четвертая
    cout << "====ПОСТФИКС====" << endl;
    marks[2]++;
    marks[3]++;
    return (*this);
}
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
// main.cpp (вызов методов и функций)
#include <iostream>
 
#include "stud.h"
 
using namespace std;
 
int main() {
    setlocale(LC_ALL, "RUS");
    Stud FIRST_TRY; //создаем объект класса
    FIRST_TRY.set(); //ввод фамилии/курса
    exam(FIRST_TRY); //ввод оценок
    FIRST_TRY.get(); //вывод объекта
   // Stud SECOND_TRY;
   //SECOND_TRY.set();
    //exam(SECOND_TRY);
   // SECOND_TRY.get();
    cout << "ПРОДОЛЖИТЬ?" << endl;
    int pick;
    if (cin >> pick && pick == 1) {
        cout << "===ПРОДОЛЖАЕМ===" << endl;
        system("pause");
        system("cls");
    }
    else if (pick != 1)
        exit(0);
    else {
        cout << "===ОШИБКА!!!===" << endl;
        system("pause");
        exit(0);
    }
    cout << "==========================" << endl;
    Stud STUDENTS_ARRAY[1];
    STUDENTS_ARRAY[0] = FIRST_TRY;
    //STUDENTS_ARRAY[1] = SECOND_TRY;
    cout << "=====МАССИВ СТУДЕНТОВ======" << endl;
    for (int i = 0; i < 1; i++)
        STUDENTS_ARRAY[i].get();
    ++FIRST_TRY; //префикс                      //ну вот здесь все самое интересное начинается
    FIRST_TRY.get(); //вывод префикса
    FIRST_TRY++; //постфикс
    FIRST_TRY.get(); //вывод постфикса
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.09.2013, 00:34     Перегрузка операторов
Посмотрите здесь:

Перегрузка операторов C++
перегрузка операторов C++
C++ перегрузка операторов
C++ Перегрузка операторов
Перегрузка операторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ded_Vasilij
 Аватар для Ded_Vasilij
229 / 211 / 15
Регистрация: 01.09.2012
Сообщений: 2,103
24.09.2013, 01:35     Перегрузка операторов #2
Цитата Сообщение от dkg_C Посмотреть сообщение
а то преподы нынче и сами ничего не знают.
+1,

Добавлено через 23 секунды
сейчас посмотрим
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
24.09.2013, 01:52  [ТС]     Перегрузка операторов #3
Цитата Сообщение от Ded_Vasilij Посмотреть сообщение
+1,

Добавлено через 23 секунды
сейчас посмотрим
Благодарю, если что по коду не поймете - объясню.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
24.09.2013, 03:24     Перегрузка операторов #4
Я не вник почему в перфиксной Вы увеличиваете первые две оценки, а остальные в постфиксной... хозяин, - барин. Однако, как бы ни было, но если постфиксная то может:
C++
1
2
3
4
5
6
7
Stud Stud::operator++ (int) { //a++ - третья и четвертая
    cout << "====ПОСТФИКС====" << endl;
Stud old(*this);
    marks[2]++;
    marks[3]++;
    return old;
}
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
24.09.2013, 11:12  [ТС]     Перегрузка операторов #5
IGPIGP, преподу лишь бы дать, я бы тоже просто увеличил и перегрузил бы оба оператора на возвращение уже нового значения. Что я и сделал..Без понятия, ваш пример тоже возвращает новое значение.
Может я не так записываю в main перегруженные операторы?:/
C++
1
2
3
4
++FIRST_TRY; //префикс                      
    FIRST_TRY.get(); //вывод префикса
    FIRST_TRY++; //постфикс
    FIRST_TRY.get(); //вывод постфикса
Миниатюры
Перегрузка операторов  
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
24.09.2013, 12:07     Перегрузка операторов #6
Цитата Сообщение от dkg_C Посмотреть сообщение
IGPIGP, преподу лишь бы дать, я бы тоже просто увеличил и перегрузил бы оба оператора на возвращение уже нового значения.
Лучший вариант, - понять, что он имел ввиду.
Цитата Сообщение от dkg_C Посмотреть сообщение
ваш пример тоже возвращает новое значение.
Не новое возвращает. Напишите:
C++
1
2
3
4
5
6
7
int a=0;
a =   ++FIRST_TRY; //префикс
cout<<a<<endl;//тут инкрементированное значение
FIRST_TRY.get(); //вывод префикса
a =   FIRST_TRY++; //постфикс
cout<<a<<endl;//тут не инкрементированное значение
  FIRST_TRY.get(); //вывод постфикса
Пока, по моим наблюдениям - 1:0 в пользу преподавателя.
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
25.09.2013, 01:52  [ТС]     Перегрузка операторов #7
IGPIGP, неа, не работает.
Остальное все сделал.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6172 / 2901 / 284
Регистрация: 04.12.2011
Сообщений: 7,714
Записей в блоге: 3
25.09.2013, 03:10     Перегрузка операторов #8
Цитата Сообщение от dkg_C Посмотреть сообщение
не работает.
У меня работает. Попробуйте прочесть внимательно и на С++ компиляторе скомпилировать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2013, 20:04     Перегрузка операторов
Еще ссылки по теме:

C++ Перегрузка операторов С++
C++ перегрузка операторов
C++ Перегрузка операторов

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

Или воспользуйтесь поиском по форуму:
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
30.09.2013, 20:04  [ТС]     Перегрузка операторов #9
IGPIGP, да-да, у вас работало, но вы в код бы заглянули мой
Я уже с этим разобрался...давненько, да. Создать просто надо было новый объект класса и уже писать так, как вы писали с a =...
Yandex
Объявления
30.09.2013, 20:04     Перегрузка операторов
Ответ Создать тему
Опции темы

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