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

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

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

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

25.04.2013, 16:20. Просмотров 679. Ответов 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();
}
    }
 
 
 
}
Дальше не фига не могу перегрузить оператор. Обьясните кто нибудь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 16:27     Как перегрузить оператор #2
alexSo94, какой оператор вы пытаетесь перегрузить? Я что не заметил.
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 16:31  [ТС]     Как перегрузить оператор #3
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, какой оператор вы пытаетесь перегрузить? Я что не заметил.
==
C++
1
2
3
bool operator ==(const CStudent &);
bool CStudent::operator ==(const CStudent &a)
{return number==a.number;}
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 540
25.04.2013, 16:36     Как перегрузить оператор #4
C++
1
2
3
4
bool operator==(const CStudent& left, const CStudent& right)
{
    return left.number == right.number;
}
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 16:58  [ТС]     Как перегрузить оператор #5
Цитата Сообщение от Afflicted Посмотреть сообщение
C++
1
2
3
4
bool operator==(const CStudent& left, const CStudent& right)
{
    return left.number == right.number;
}
C++
1
2
3
4
5
6
c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.cpp(46): error C2248: CStudent::number: невозможно обратиться к private член, объявленному в классе "CStudent"
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.h(11): см. объявление "CStudent::number"
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.h(8): см. объявление "CStudent"
1>c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.cpp(46): error C2248: CStudent::number: невозможно обратиться к private член, объявленному в классе "CStudent"
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.h(11): см. объявление "CStudent::number"
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\cstudent.h(8): см. объявление "CStudent"
класс студент
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
#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:
    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();// метод вывода данных о студенте на экран
    bool operator==(const CStudent&);
 
 
};
 #endif
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:02     Как перегрузить оператор #6
alexSo94, я знаете чего не пойму? В ищете группу,


Цитата Сообщение от alexSo94 Посмотреть сообщение
list <CStudent>::iterator location = find(students.begin(),students.end(),number);
так, если такой не найдено, find вернет end, иначе вернет итератор на нужный элемент, проверка

Цитата Сообщение от alexSo94 Посмотреть сообщение
if (location==students.begin())
не нужна, поскольку в location и будет нужный результат, поэтому необходимости в перегруженном операторе == нет.
Afflicted
Обитатель форума
199 / 182 / 8
Регистрация: 28.10.2012
Сообщений: 540
25.04.2013, 17:03     Как перегрузить оператор #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
class CStudent
{
 
    public:
        friend bool operator==(const CStudent& left, const CStudent& right);
 
};
 
bool operator==(const CStudent& left, const CStudent& right)
{
    return left.number== right.number;
}
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:08     Как перегрузить оператор #8
alexSo94, я бы вот так сделал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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;
            cout<<"Студент с заданной группой найден:"<<number<<endl;
        location->output();
    }
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 17:30  [ТС]     Как перегрузить оператор #9
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, я знаете чего не пойму? В ищете группу,




так, если такой не найдено, find вернет end, иначе вернет итератор на нужный элемент, проверка



не нужна, поскольку в location и будет нужный результат, поэтому необходимости в перегруженном операторе == нет.
Когда я убираю
C++
1
bool operator==(const CStudent& left, const CStudent& right);
Вываливаеться куча ошибок(
stima
432 / 287 / 16
Регистрация: 22.03.2011
Сообщений: 936
Завершенные тесты: 1
25.04.2013, 17:34     Как перегрузить оператор #10
Читайте про предикаты.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:35     Как перегрузить оператор #11
alexSo94, а что за ошибки? Просто я реально не пойму зачем сравнивать уже найденное число с самим собой, это не логично, давайте посмотрим что выскакивает покажите сейчас как выглядит функция и покажите ошибки какие выдает компилятор
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 17:39  [ТС]     Как перегрузить оператор #12
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, а что за ошибки? Просто я реально не пойму зачем сравнивать уже найденное число с самим собой, это не логично, давайте посмотрим что выскакивает покажите сейчас как выглядит функция и покажите ошибки какие выдает компилятор
И так попорядку:
Вот значит класс CStudent.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
25
26
#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:
    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
CStudent.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
#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;
    
}
 
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.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
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
//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=find(students.begin(), students.end(),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
    {
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();
}
    }
 
 
 
}
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();
    }
        
}
ошибки
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
d:\visual studio 2010\vc\include\algorithm(41): error C2678: бинарный "==": не найден оператор, принимающий левый операнд типа "CStudent" (или приемлемое преобразование отсутствует)
1>          d:\visual studio 2010\vc\include\exception(470): может быть "bool std::operator ==(const std::_Exception_ptr &,const std::_Exception_ptr &)"
1>          d:\visual studio 2010\vc\include\exception(475): или       "bool std::operator ==(std::_Null_type,const std::_Exception_ptr &)"
1>          d:\visual studio 2010\vc\include\exception(481): или       "bool std::operator ==(const std::_Exception_ptr &,std::_Null_type)"
1>          d:\visual studio 2010\vc\include\system_error(408): или       "bool std::operator ==(const std::error_code &,const std::error_condition &)"
1>          d:\visual studio 2010\vc\include\system_error(416): или       "bool std::operator ==(const std::error_condition &,const std::error_code &)"
1>          при попытке сопоставить список аргументов "(CStudent, const CStudent)"
1>          d:\visual studio 2010\vc\include\algorithm(74): см. ссылку на создание экземпляров функции шаблон при компиляции "_InIt std::_Find<std::_List_unchecked_iterator<_Mylist>,_Ty>(_InIt,_InIt,const _Ty &)"
1>          with
1>          [
1>              _InIt=std::_List_unchecked_iterator<std::_List_val<CStudent,std::allocator<CStudent>>>,
1>              _Mylist=std::_List_val<CStudent,std::allocator<CStudent>>,
1>              _Ty=CStudent
1>          ]
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\newstudent.cpp(55): см. ссылку на создание экземпляров функции шаблон при компиляции "_InIt std::find<std::_List_iterator<_Mylist>,CStudent>(_InIt,_InIt,const _Ty &)"
1>          with
1>          [
1>              _InIt=std::_List_iterator<std::_List_val<CStudent,std::allocator<CStudent>>>,
1>              _Mylist=std::_List_val<CStudent,std::allocator<CStudent>>,
1>              _Ty=CStudent
1>          ]
1>d:\visual studio 2010\vc\include\algorithm(41): error C2678: бинарный "==": не найден оператор, принимающий левый операнд типа "CStudent" (или приемлемое преобразование отсутствует)
1>          d:\visual studio 2010\vc\include\exception(470): может быть "bool std::operator ==(const std::_Exception_ptr &,const std::_Exception_ptr &)"
1>          d:\visual studio 2010\vc\include\exception(475): или       "bool std::operator ==(std::_Null_type,const std::_Exception_ptr &)"
1>          d:\visual studio 2010\vc\include\exception(481): или       "bool std::operator ==(const std::_Exception_ptr &,std::_Null_type)"
1>          d:\visual studio 2010\vc\include\system_error(408): или       "bool std::operator ==(const std::error_code &,const std::error_condition &)"
1>          d:\visual studio 2010\vc\include\system_error(416): или       "bool std::operator ==(const std::error_condition &,const std::error_code &)"
1>          при попытке сопоставить список аргументов "(CStudent, const int)"
1>          d:\visual studio 2010\vc\include\algorithm(74): см. ссылку на создание экземпляров функции шаблон при компиляции "_InIt std::_Find<std::_List_unchecked_iterator<_Mylist>,_Ty>(_InIt,_InIt,const _Ty &)"
1>          with
1>          [
1>              _InIt=std::_List_unchecked_iterator<std::_List_val<CStudent,std::allocator<CStudent>>>,
1>              _Mylist=std::_List_val<CStudent,std::allocator<CStudent>>,
1>              _Ty=int
1>          ]
1>          c:\users\sany\documents\visual studio 2010\projects\newstudent\newstudent\newstudent.cpp(108): см. ссылку на создание экземпляров функции шаблон при компиляции "_InIt std::find<std::_List_iterator<_Mylist>,int>(_InIt,_InIt,const _Ty &)"
1>          with
1>          [
1>              _InIt=std::_List_iterator<std::_List_val<CStudent,std::allocator<CStudent>>>,
1>              _Mylist=std::_List_val<CStudent,std::allocator<CStudent>>,
1>              _Ty=int
1>          ]
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:00.87
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 17:53     Как перегрузить оператор #13
alexSo94, ну что могу сказать, вся твоя проблема не в перегрузке оператора ==, тебе нужно написать предикат для сравнения к алгоритму find, так как ты пытаешься сравнивать объект класса студент с целым числом, сейчас покажу как примерно надо
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 17:57  [ТС]     Как перегрузить оператор #14
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, а зачем ты номер группы сделал перечислением, да еще его реализовал отдельно от класса? Ты же не сможешь искать...
Ну там задание было, что нужно ввести номер группы с фиксированного списка.
yoghurt92
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 18:11     Как перегрузить оператор #15
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();
    }
        
}
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
373 / 344 / 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
373 / 344 / 22
Регистрация: 17.05.2012
Сообщений: 1,049
25.04.2013, 18:46     Как перегрузить оператор #19
alexSo94, ну в цикле не сложно, сейчас покажу
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.04.2013, 18:47     Как перегрузить оператор
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alexSo94
140 / 4 / 1
Регистрация: 24.02.2013
Сообщений: 46
25.04.2013, 18:47  [ТС]     Как перегрузить оператор #20
Цитата Сообщение от yoghurt92 Посмотреть сообщение
alexSo94, ну в цикле не сложно, сейчас покажу
Ок спасибо огромное.
Yandex
Объявления
25.04.2013, 18:47     Как перегрузить оператор
Ответ Создать тему
Опции темы

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