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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
#1

Как перегрузить оператор - C++

25.04.2013, 16:20. Просмотров 731. Ответов 26
Метки нет (Все метки)

Вот написал функцию поиска студента по номеру группы. STL list
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
void find()
{
    setlocale( LC_ALL,"Russian" );
    if (students.empty()) cout<<"Нет студентов в списке";
    else
    {
int number;
cout<<"Введите искомую группу"<<endl;
cin>>number;
list <CStudent>::iterator location = find(students.begin(),students.end(),number);
if (location==students.end())
    cout<<"Ничего не найдено"<<endl;
else
{
    cout<<"Результат:"<<endl;
    if (location==students.begin())
        cout<<"Студент с заданной группой найден:"<<number<<endl;
    location->output();
}
    }
 
 
 
}
Дальше не фига не могу перегрузить оператор. Обьясните кто нибудь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.04.2013, 16:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как перегрузить оператор (C++):

Как перегрузить оператор<< и оператор>> ? - C++
Доброго времени суток. Застрял на двух вопросах и не как не могу найти инфу которвя мне помогла бы их решить. вопрос первый. В общем...

Как перегрузить оператор []? - C++
вообщем есть класс class Point{ private: int color_id, state; public: //constructors Point(); //destructors ...

Как перегрузить оператор = - C++
ну там чтоб он например сложение делал или чтото другое

Как перегрузить оператор разыменования * - C++
Как перегрузить оператор разыменования?

Как правильно перегрузить оператор [] = - C++
вот например в классе хранится массив, и допустим я хочу елементу массива в этом классе присвоить другое значение, тоесть так, class...

Как перегрузить оператор ввода? - C++
Как перегрузить оператор ввода? rational.h #define _Rational_h_ #include &lt;iostream&gt; using namespace std; int nod(int p,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 18:39  [ТС] #16
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, хорошо, сейчас пересмотрю

Добавлено через 9 минут
alexSo94, твой .h

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
#ifndef CStudent_H
#define CStudent_H
#include <string>
using namespace std;
 
enum number_type{G1, G2, unknown};
 
class CStudent
{
    string name;
    number_type number;
    int year;
        
    public:
        friend bool operator==(const CStudent& left, const CStudent& right);
        CStudent();//конструктор «пустого» студента
        CStudent(string, number_type,  int);//конструктор создания студента на основе заданных фамилии, специальности, пола и года
        string get_name() {return name;}
        number_type number_gender(){return number;}
        int get_year(){return year;}
        void input();// метод ввода данных о студенте с клавиатуры
        void output();// метод вывода данных о студенте на экран
};
#endif
твой .cpp

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
#include "StdAfx.h"
#include "CStudent.h"
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
 
CStudent::CStudent(): name(""), number(unknown), year(0) {}
 
CStudent::CStudent(string n, number_type g, int y)
{
    name=n;
    number=g;
    year=y;
    
}
 
bool operator==(const CStudent& left, const CStudent& right)
{
    return (left.number== right.number && left.name== right.name
        && left.year== right.year);
}
 
void CStudent::output()
{
    cout.setf(ios::left);
    cout<<"\n"<<setw(30)<<name;
    if (number==G1) cout<<setw(8)<<"Первая"; 
    else if (number==G2) cout<<setw(8)<<"Вторая";
        else cout<<setw(8)<<"unknown";
    cout<<setw(4)<<year;
    
}
 
void CStudent::input()
{
    cout<<"\n Введите имя: ";
    getline(cin,name);
    getline(cin,name);
    cout<<"\n Введите группу (0-Первая, 1-Вторая) : ";
    bool f;
    cin>>f;
    if (f==0) number=G1; else number=G2;
    cout<<"\n Введите возраст: ";
    cin>>year;
    cout << "\n";
}
и 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
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
//9.    Описать класс СТУДЕНТ (поля: ФИО, ГОД РОЖДЕНИЯ, КОД ГРУППЫ). Написать программу для работы со списком событий, используя контейнерный класс list. Программа должна обеспечивать выбор с помощью меню и выполнение одной из следующих функций:
//a)    начальное формирование списка студентов (ввод с клавиатуры или из заданного массива);
//b)    добавления студента  в конец списка;
//c)    вывод списка студентов на экран;
//d)    удаление из массива студента с определенной ФИО; 
//e)    поиск в списке всех студентов с заданным номером группы.
 
//
 
#include "stdafx.h"
#include "CStudent.h"
#include <iostream>
#include <conio.h> 
#include <list>
#include <algorithm>
list <CStudent> students;
 
void add()
{
    CStudent tmp; //cоздаём объект
    tmp.input(); //вводим данные
    students.push_back(tmp); //добавляем в конец списка
}
 
void output()
{
    setlocale( LC_ALL,"Russian" );
    if (students.empty()) cout<<"Нет студентов в списке";
    else 
        for (list<CStudent>::iterator i = students.begin(); i!=students.end(); ++i)
        i->output();
    
 
}
 
 
 
void del ()
{
    setlocale( LC_ALL,"Russian" );
    
    if (students.empty()) cout<<"Нет студентов в списке";
    else 
    {
        string name;
        cout<<"\nВведите фамилию студента, данные о котом Вы хотите удалить "<<endl;
        getline(cin,name);
        getline(cin,name);
        CStudent stud(name, G1, 0);
        list <CStudent>::iterator location;
 
        location=find_if(students.begin(), students.end(),[stud](CStudent &op)
        {
            return op == stud;  
        }); 
 
        if (location!=students.end()) 
        { 
            students.erase(location);
            cout<<"\nСтудент с заданной фамилией "<<name<<" удален";
        }
        else    cout<<"\nВ списке нет студента с  фамилией "<<name;
    }
}
 
void new_list()
{
    setlocale( LC_ALL,"Russian" );
    
    cout<<"Будуте вводить данные с клавиатуры(y/n)? ";
        char s;
        cin>>s;
        if (s=='y' || s=='Y') 
        {       
            cout<<"Введите количество студентов ";
            int n;
            cin>>n;
            for (int i=1; i<=n; i++ ) 
                add();
        }                   
        else 
        {
            CStudent ar[]={
                CStudent ("Petrova", G1, 1995),
                CStudent ("Sidorov", G1, 1995),
                CStudent ("Utkin", G2, 1995),
                CStudent("Ivanova", G1, 1993),
                CStudent ("Antonov", G2, 1991)
            };
            int size=sizeof(ar)/sizeof(CStudent);
            list <CStudent> s(ar, ar+size);
            students=s;
            cout<<"\nСписок сфорирован из заданного массива";
        }
        cout<<"\nФормирование списка завершено";
        
}
 
void find()
{
    setlocale( LC_ALL,"Russian" );
    if (students.empty()) cout<<"Нет студентов в списке";
    else
    {
number_type number = G1;
cout<<"Введите искомую группу"<<endl;
 
list <CStudent>::iterator location;
location = find_if(students.begin(),students.end(),[&number](CStudent &op)
    {
        return op.number_gender() == number;    
    });
 
if (location==students.end())
    cout<<"Ничего не найдено"<<endl;
else
{
    cout<<"Результат:"<<endl;
        cout<<"Студент с заданной группой найден:"<<number<<endl;
    location->output();
}
    }
}
 
int main ()
{
    setlocale (0,"Rus");
    bool q=0;
    
 
    while (q!=1)
    {
        cout<<"\nВыберите действие:\n";
        cout<<"1 - Начальное формирование списка студентов (ввод с клавиатуры или из заданного массива);\n";
        cout<<"2 - Добавления студента  в конец списка\n";
        cout<<"3 - Вывод списка студентов на экране\n";
        cout<<"4 - Удаление из массива студента с определенной ФИО\n";
        cout<<"5 - Поиск в списке всех студентов с заданным номером группы";
        cout<<"0 - Выход\n";
        
        char n;
 
        cin>>n;
        switch(n)
        {
        case '1':   
            {
                if (students.empty())
                    new_list(); 
                else cout<<"Список уже сформирован, Вы можете только добавить студента"; 
                break;
            }
        case '2':   {
                   add();
                   break;
                    }
        case '3':
            {
                   output();
                    break;
            }
        case '4':   {
                   del ();
                    break;
                    }
        case '5':   {
                    /*find();*/
 
                    break;
                    }
        case '0':   {q=1; break;}
        default:    cout<<"Ошибка ввода\n";
        }
        
        cout<<"\nДля продолжения нажмите Enter"; 
        _getch();
    }
        
}
СПасибо огромное. Хотелось бы узнать подробнее о строке 52 main . Да и еще функция ищет только одного студента с заданной группой.
Миниатюры
Как перегрузить оператор  
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 18:42 #17
alexSo94, это лямбда функция, да, программа ищет первого студента, если надо всех, то уже нужен не алгоритм, нужно в цикле по итераторам идти
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 18:45  [ТС] #18
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, это лямбда функция, да, программа ищет первого студента, если надо всех, то уже нужен не алгоритм, нужно в цикле по итераторам идти
ппц. Ну спасибо и на этом.
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 18:46 #19
alexSo94, ну в цикле не сложно, сейчас покажу
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 18:47  [ТС] #20
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, ну в цикле не сложно, сейчас покажу
Ок спасибо огромное.
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 18:51 #21
alexSo94, ну вот как-то так, не компилил, если что-то вылезет скажи)

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
void find()
{
    setlocale( LC_ALL,"Russian" );
 
    bool flag(false);
    if (students.empty()) 
        cout<<"Нет студентов в списке";
    else
    {
        number_type number = G1;
        cout<<"Введите искомую группу"<<endl;
 
        list <CStudent>::iterator location(students.begin());
 
        while(location != students.end()){
            if(op.number_gender() == number){
                flag = true;
                cout<<"Результат:"<<endl;
                cout<<"Студент с заданной группой найден:"<<number<<endl;
                location->output();
            }
        }
 
        if (!flag)
            cout<<"Ничего не найдено"<<endl;
    }
}
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 18:57  [ТС] #22
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, ну вот как-то так, не компилил, если что-то вылезет скажи)

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
void find()
{
    setlocale( LC_ALL,"Russian" );
 
    bool flag(false);
    if (students.empty()) 
        cout<<"Нет студентов в списке";
    else
    {
        number_type number = G1;
        cout<<"Введите искомую группу"<<endl;
 
        list <CStudent>::iterator location(students.begin());
 
        while(location != students.end()){
            if(op.number_gender() == number){
                flag = true;
                cout<<"Результат:"<<endl;
                cout<<"Студент с заданной группой найден:"<<number<<endl;
                location->output();
            }
        }
 
        if (!flag)
            cout<<"Ничего не найдено"<<endl;
    }
}
Ругаеться на op
C++
1
2
c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\newstudent.cpp(114): error C2065: op: необъявленный идентификатор
1>c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\newstudent.cpp(114): error C2228: выражение слева от ".number_gender" должно представлять класс, структуру или объединение
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 19:01 #23
alexSo94,

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
void find()
{
    setlocale( LC_ALL,"Russian" );
 
    bool flag(false);
    if (students.empty()) 
        cout<<"Нет студентов в списке";
    else
    {
        number_type number = G1;
        cout<<"Введите искомую группу"<<endl;
 
        list <CStudent>::iterator location(students.begin());
 
        while(location != students.end()){
            if(location -> number_gender() == number){
                flag = true;
                cout<<"Результат:"<<endl;
                cout<<"Студент с заданной группой найден:"<<number<<endl;
                location->output();
            }
        }
 
        if (!flag)
            cout<<"Ничего не найдено"<<endl;
    }
}
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 19:07  [ТС] #24
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94,

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
void find()
{
    setlocale( LC_ALL,"Russian" );
 
    bool flag(false);
    if (students.empty()) 
        cout<<"Нет студентов в списке";
    else
    {
        number_type number = G1;
        cout<<"Введите искомую группу"<<endl;
 
        list <CStudent>::iterator location(students.begin());
 
        while(location != students.end()){
            if(location -> number_gender() == number){
                flag = true;
                cout<<"Результат:"<<endl;
                cout<<"Студент с заданной группой найден:"<<number<<endl;
                location->output();
            }
        }
 
        if (!flag)
            cout<<"Ничего не найдено"<<endl;
    }
}
Блин не работает
Миниатюры
Как перегрузить оператор  
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 19:12 #25
alexSo94, тупонул

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
void find()
{
    setlocale( LC_ALL,"Russian" );
 
    bool flag(false);
    if (students.empty()) 
        cout<<"Нет студентов в списке";
    else
    {
        number_type number = G1;
        cout<<"Введите искомую группу"<<endl;
 
        list <CStudent>::iterator location(students.begin());
 
        while(location != students.end()){
            if(location -> number_gender() == number){
                flag = true;
                cout<<"Результат:"<<endl;
                cout<<"Студент с заданной группой найден:"<<number<<endl;
                location->output();
            }
 
            ++location;
        }
 
        if (!flag)
            cout<<"Ничего не найдено"<<endl;
    }
}
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 19:17  [ТС] #26
yoghurt92, спасибо тебе огромное. На досуге буду подробно разбирать итераторы.
yoghurt92
374 / 345 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 19:19 #27
alexSo94, да сам недавно их прошел, удачи)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2013, 19:19
Привет! Вот еще темы с ответами:

Как перегрузить оператор в виртуальном классе - C++
Помогите пожалста разобраться с перегрузкой операторов в абстрактных классах!!!! Есть чисто виртуальный класс физических величин ...

Как перегрузить оператор ввода из файла? - C++
Допустим у нас есть класс: class A {friend ifstream &amp;operator&gt;&gt;(ifstream &amp;, A &amp;); private: char a; char b; ...

Как в классе перегрузить оператор двойного индексирование? - C++
Вот мой класс.. class Matrix { int ** m; public: Matrix() { srand(time(NULL)); m=new int*;

Как перегрузить оператор [][] для разреженной матрицы? - C++
как перегрузить оператор для разреженной матрицы?знаю, что такого оператора нет, есть только , но все равно не понимаю как его перегрузить


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.04.2013, 19:19
Ответ Создать тему
Опции темы

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