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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Массив структур http://www.cyberforum.ru/cpp-beginners/thread960922.html
Нужно создать массив структур и разработать программное приложение, которое включает его обработку с выводом результата на экран (глобальные переменные не использовать, функция main должна быть предназначена только для вызова функции) Условие: В магазине сформирован список постоянных клиентов, который включает ФИО, домашний адрес и размер предоставленной скидки. Удалить из этого списка все...
C++ Не вижу сообщения из цикла фор Не представляю что это может быть. (строка 83) cout << "p1: " << p1 << endl; cout << "i: " << i << endl; //Листинг 8.11. Выделение слов из массива символов #include <string> #include <iostream> // для объекта cout using namespace std; #include<iomanip> //Этот файл содержит большую часть манипуляторов C++. Если вы не знаете, что такое манипулятор, не беспокойтесь. Просто подключите это... http://www.cyberforum.ru/cpp-beginners/thread960912.html
C++ Абстракция вызова функции
Итак я хотел бы обсудить с участниками форума такую задачу. Но перед тем как перейти к сути - замечу, что вопросы морально-этического облика человека, поставившего эту задачу, и степень адекватности постановки задачи впринципе - не должны стать ключевыми в ходе обсуждения. К сожалению ввиду множества нюансов описание может затянуться и боюсь это вопрос не из серии "С++ для начинающих", но доступа...
C++ Как использовать перегруженный оператор [ ], если дан не сам класс, а указатель на него?
Это указатель на класс figure *f Это перегрузка оператора void figure::operator (int i) { cout << "(" << massiv.x << "," << massiv.y << ")" << endl; } В нужный момент вызываю оператор, но пишет, что он без побочного эффекта, и ничего не выводит f
C++ Масив через рекурсию http://www.cyberforum.ru/cpp-beginners/thread960854.html
В упорядоченном массиве целых чисел ai, i = 1 ... n найти номер элемента "c" методом бинарного поиска, используя очевидное соотношение: если c<= an/2, тогда c є1...аn/2] , иначе c єn/2+1...an] . Если элемент c отсутствует в массиве, то вывести соответствующее сообщение. Решить двумя способами с рекурсией и без нее.. спасибо!
C++ Перегруженные шаблоны Написать перегруженные шаблоны для решения уравнения: ax^2+bx+c=0 подробнее

Показать сообщение отдельно
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
24.09.2013, 00:34     Перегрузка операторов
Привет, ребят! Помогите разобраться с перегрузкой, а то преподы нынче и сами ничего не знают. Вот.
Имеем три файла (ну если кто захочет скомпилить): 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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru