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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
#1

Перегрузка операций '<<' и '>>' - C++

17.10.2010, 16:52. Просмотров 1927. Ответов 32
Метки нет (Все метки)

Добрый вечер всем
У меня вот такое задание:
Создайте класс, реализующий однонаправленную очередь. В интерфейс класса должны входить перегруженные операции:
1) добавить элемент в конец очереди (<<);
2) извлечь элемент из начала очереди (>>).

Вот что смог написать (что не мог я закоментил):
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
#include <string.h>
#include <iostream>
using namespace std;
class Ocher{
private:
    struct Element{     // структура, задающая элемент списка
        int key;        // поле для хранения данных
        Element *next;  // указатель на следующий элемент
    };
    Element* pbeg;//начало очереди
    Element* pend;//конец очереди
public:
    Ocher(){
        Element* pbeg = 0;
        Element* pend = 0;
    }
    int operator <<(int a);
    int operator >>(Element** pbeg);
    void print(){
        while (pbeg != 0){
            Element *ph = pbeg;
            pbeg=pbeg->next;
            cout<<" "<<ph->key;
        }
    }
}
int Ocher::operator << (int a){
    Element* ph = new Element;
    ph->key = a;
    ph->next = 0;
    if (*pend!=0){   //здесь везде подчеркивает знак '=', почему незнаю
        (*pend)->next = ph;
        *pend = ph;
    }
    else{
        *pbeg = ph;
        *pend = ph;
    }
    return 0;
}
 
int Ocher::operator>>(Element** pbeg){
    int d = (*pbeg)->key;
    Element* ph = *pbeg;
    *pbeg = (*pbeg)->next;
    delete ph;
    return d;
}
 
int main(){
    setlocale(LC_ALL,"Russian");
    Ocher w;
    int b,a;
    while(true){
        system("cls");
        cout<<"1) Заполнить очередь"<<endl;
        cout<<"2) Вывести на экран"<<endl;
        cout<<"3) Удалить элемент"<<endl;
        cout<<"0) Выход"<<endl;
        cout<<"Ввод: "; cin>>b;
        if (b == 1){
            system("cls");
            cout<<"Введите значение: ";
            cin>>a;
            w<<a;
            cin.clear();
            fflush(stdin);
            continue;
        }
        if (b == 2){
            system("cls");
            cout<<"Список: ";
            w.print;//здесь ошибка (из за точки), хочу что бы распечаталсся список
            while (true){
                cout<<"\n0) Выход: ";
                int z; cin>>z;
                if (z == 0) break;
                cin.clear();
                fflush(stdin);
                continue;
            }
            cin.clear();
            fflush(stdin);
            continue;
        }
        if (b == 3){
            //Здесь не знаю как сделать что бы из очереди удалился первый элемент
        }
        system("cls");
        if (b == 0) break;
 
    }
 
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2010, 16:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Перегрузка операций '<<' и '>>' (C++):

ПЕРЕГРУЗКА ОПЕРАЦИЙ - C++
Всем добрый день.Нужна помощь по перегрузкам операций.Написать программу.Кто сможет помочь,буду очень признательна.Спасибо. 1. Выбрать...

Перегрузка операций - C++
C++ Перегрузка операций.. Помоги написать прогу Определить класс для работы с квадратной матрицей. Получить величину к одним из...

Перегрузка операций - C++
Добрый вечер, имеется код нахождения параллельности двух прямых или же угла между ними, который нужно разбить на библиотеку, которая будет...

Перегрузка операций - C++
Задание у меня перегрузить операции: + добавить элемент в множество; * пересечение множеств; int() мощность множества. Вот...

Перегрузка операций - C++
Выполнить перезагрузку перечисленных операций, закрепив за ними соответствующий функциональный смысл! дано шестнадцатиричное число. &quot;+&quot;...

перегрузка операций - C++
Обычным методом задача решена, помогите пожалуйста сделать перегрузку операций Условие: Указанные в заданиях операции реализовать...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
17.10.2010, 18:44 #16
Замени в возвращаемом значении операторов int на List&, и в конце каждого из них пропиши
C++
1
return *this;
Замени 46 строку на
C++
1
a = pbeg->key;
Удаление первого элемента из очереди делай так:
C++
1
2
int b;
w >> b; // в b теперь хранится значение удаленного первого элемента очереди
Добавлено через 1 минуту
Цитата Сообщение от robert19 Посмотреть сообщение
C++
1
w.print;//здесь ошибка (из за точки), хочу что бы распечаталсся список
Забыл скобки:
C++
1
w.print();
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
17.10.2010, 18:44  [ТС] #17
error C2628: недопустимый "List" с последующим "int" (возможно, отсутствует ";")
error C2556: List List::operator <<(int): перегруженная функция отличается от "int List::operator <<(int)" только возвращаемым типом
error C2371: List::operator <<: переопределение; различные базовые типы
error C2678: бинарный "!=": не найден оператор, принимающий левый операнд типа "List::Element" (или приемлемое преобразование отсутствует)
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\system_error(432): или "bool std::operator !=(const std::error_condition &,const std::error_code &)"
1> при попытке сопоставить список аргументов "(List::Element, int)"
error C2819: тип "List::Element" не имеет перегруженный "operator ->"
error C2232: ->List::Element::next: левый операнд имеет тип "struct", используйте "."
error C2679: бинарный "=": не найден оператор, принимающий правый операнд типа "List::Element *" (или приемлемое преобразование отсутствует)
error C2679: бинарный "=": не найден оператор, принимающий правый операнд типа "List::Element *" (или приемлемое преобразование отсутствует)
error C2679: бинарный "=": не найден оператор, принимающий правый операнд типа "List::Element *" (или приемлемое преобразование отсутствует)
error C2440: return: невозможно преобразовать "int" в "List &"
error C2264: List::operator <<: ошибка в определении или объявлении функции; функция не вызвана
error C2088: <<: недопустимо для class
error C3867: List:rint: в вызове функции отсутствует список аргументов; используйте "&List:rint" для создания указателя на член
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
17.10.2010, 18:50 #18
robert19, а теперь покажи, как ты объявил и описал операторы
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
17.10.2010, 18:57  [ТС] #19
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
#include <string.h>
#include <iostream>
using namespace std;
class List{
private:
    struct Element{     // структура, задающая элемент списка
        int key;        // поле для хранения данных
        Element *next;  // указатель на следующий элемент
    };
    Element* pbeg;//начало очереди
    Element* pend;//конец очереди
public:
    List(){
        Element* pbeg = 0;
        Element* pend = 0;
    }
    int operator <<(int a);
    List& operator >>(List&);
    void print();
    ~List(){
        if(pbeg){
            pend=pbeg;
            while (pbeg)
                pbeg=pbeg->next;
            delete pend;
            pend=pbeg;
        }
    }
}
int List::operator << (int a){// если поменять на List&  List::operator <<  (int a)... Выдает ошибку
    Element* ph = new Element;
    ph->key = a;
    ph->next = 0;
    if (pend!=0){
        pend->next = ph;
        pend = ph;
    }
    else{
        pbeg = ph;
        pend = ph;
    }
    return *this;//тут ругается
}
 
List& List::operator>>(List&){
    int a = pbeg->key;
    Element* ph = pbeg;
    pbeg = pbeg->next;
    delete ph;
    return *this;
}
 
void List::print(){
    while (pbeg != 0){
        Element *ph = pbeg;
        pbeg = pbeg->next;
        cout<<" "<<ph->key;
    }
}
 
int main(){
    setlocale(LC_ALL,"Russian");
    List w;
    int b,a;
    while(true){
        system("cls");
        cout<<"1) Заполнить очередь"<<endl;
        cout<<"2) Вывести на экран"<<endl;
        cout<<"3) Удалить элемент"<<endl;
        cout<<"0) Выход"<<endl;
        cout<<"Ввод: "; cin>>b;
        if (b == 1){
            system("cls");
            cout<<"Введите значение: ";
            cin>>a;
            w<<a;
            cin.clear();
            fflush(stdin);
            continue;
        }
        if (b == 2){
            system("cls");
            cout<<"Список: ";
            w.print();//здесь ошибка (из за точки), хочу что бы распечаталсся список
            while (true){
                cout<<"\n0) Выход: ";
                int z; cin>>z;
                if (z == 0) break;
                cin.clear();
                fflush(stdin);
                continue;
            }
            cin.clear();
            fflush(stdin);
            continue;
        }
        if (b == 3){
            //Здесь не знаю как сделать что бы из очереди удалился первый элемент
        }
        system("cls");
        if (b == 0) break;
 
    }
 
    return 0;
}
error C2628: недопустимый "List" с последующим "int" (возможно, отсутствует ";")
error C2556: List List::operator <<(int): перегруженная функция отличается от "int List::operator <<(int)" только возвращаемым типом
error C2371: List::operator <<: переопределение; различные базовые типы
error C2264: List::operator <<: ошибка в определении или объявлении функции; функция не вызвана
error C2088: <<: недопустимо для class
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
17.10.2010, 19:23 #20
Разберем ошибки:
Цитата Сообщение от robert19 Посмотреть сообщение
если поменять на List& List::operator << (int a)... Выдает ошибку
Нужно читать внимательней:
Цитата Сообщение от Nameless One Посмотреть сообщение
Замени в возвращаемом значении операторов int на List&, и в конце каждого из них пропиши
C++
1
return *this;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// если поменять на List&  List::operator <<  (int a)... Выдает ошибку
// и где же здесь ты поменял int на List& ?
int List::operator << (int a){
        Element* ph = new Element;
        ph->key = a;
        ph->next = 0;
        if (pend!=0){
                pend->next = ph;
                pend = ph;
        }
        else{
                pbeg = ph;
                pend = ph;
        }
        return *this;//тут ругается - ну ясен пень, *this - это ссылка на List, а в возвращаемом значении прописано int
}
Надо так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
List& List::operator << (int a){// если поменять на List&  List::operator <<  (int a)... Выдает ошибку
        Element* ph = new Element;
        ph->key = a;
        ph->next = 0;
        if (pend!=0){
                pend->next = ph;
                pend = ph;
        }
        else{
                pbeg = ph;
                pend = ph;
        }
        return *this;
}
Пошли дальше...
C++
1
2
3
4
5
6
7
List& List::operator>>(List&){
 int a = pbeg->key; 
 Element* ph = pbeg;
 pbeg = pbeg->next;
 delete ph;
 return *this;
}
Было написано:
Цитата Сообщение от Nameless One Посмотреть сообщение
Замени 46 строку на
C++
1
a = pbeg->key;
А ты что сделал? Ты заменил тип аргумента оператора, и сделал a локальной. Зачем? Надо так:
C++
1
2
3
4
5
6
7
List& List::operator>>(int& a){
 a = pbeg->key; 
 Element* ph = pbeg;
 pbeg = pbeg->next;
 delete ph;
 return *this;
}
И не забудь соответственно изменить объявления операторов внутри класса
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
17.10.2010, 19:44  [ТС] #21
Вообщем все занового переделал вот так:
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
#include <string.h>
#include <iostream>
using namespace std;
class List{
private:
        struct Element{
                int key;
                Element *next;
        };
        Element* pbeg;
        Element* pend;
public:
        List(){
                Element* pbeg = 0;
                Element* pend = 0;
        }
        List& operator <<(int a);
        List& operator >>(int& a);
        void print();
        ~List(){
            if(pbeg){
                pend=pbeg;
                while (pbeg)
                    pbeg=pbeg->next;
                delete pend;
                pend=pbeg;
            }
        }
};
List& List::operator << (int a){
    Element* ph = new Element;
    ph->key = a;
    ph->next = 0;
    if (pend!=0){
        pend->next = ph;
        pend = ph;
    }
    else{
        pbeg = ph;
        pend = ph;
    }
    return *this;
}
void List::print(){
    while (pbeg != 0){
        Element *ph = pbeg;
        pbeg = pbeg->next;
        cout<<" "<<ph->key;
    }
}
int main(){
    setlocale(LC_ALL,"Russian");
    List w; int b=0,a;
    while(true){
        cout<<"1) Заполнить очередь"<<endl;
        cout<<"2) Вывести на экран"<<endl;
        cout<<"Ввод: "; cin>>b;
        if (b == 1){
            system("cls");
            cout<<"Введите значение: ";
            cin>>a;
            w<<a;//Походу тут не правильно пишу
            cin.clear();
            fflush(stdin);
            continue;
        }
        if (b == 2){
            system("cls");
            cout<<"Список: ";
            w.print();
        }
    }
}
Все славо богу компилируется. Но при вводе значения в очеред прога виснет и вылетает
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
17.10.2010, 19:52 #22
Цитата Сообщение от robert19 Посмотреть сообщение
Но при вводе значения в очеред прога виснет и вылетает
А зачем ты в конструкторе заного объявляешь переменные-члены? Замени конструктор на такой:
C++
1
2
3
4
        List(){
                pbeg = 0;
                pend = 0;
        }
А вообще, учись пользоваться встроенным отладчиком. Помогает.

И да, деструктор у тебя неправильный. Надо так:
C++
1
2
3
4
5
6
7
8
9
~List(){
while(pbeg)
  {
   Element* temp = pbeg;
   pbeg = pbeg->next;
   delete temp;
   temp = 0; 
  }
}
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
17.10.2010, 20:09  [ТС] #23
блин точно, на счет конструктора пролител))

Добавлено через 8 минут
Вот эта функция удаления первого эелемнта в очереди:
C++
1
2
3
4
5
6
7
List& List::operator>>(int &a){
    a = pbeg->key;
    Element* ph = pbeg;
    pbeg = pbeg->next;
    delete ph;
    return *this;
}
Получается в мэйне нужно писать так:
C++
1
2
3
...
w>>a
...
нее, кажись не так
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
17.10.2010, 20:16 #24
Цитата Сообщение от robert19 Посмотреть сообщение
Получается в мэйне нужно писать так:
ага. Только не забыть поставить точку с запятой. А можно будет еще и так:
C++
1
2
int a, b, c;
w >> a >> b >> c; // Вынимаем сначала первый элемент и помещаем его в a, потом вынимаем второй и помещаем его в b, потом вынимаем третий и помещаем его в c и т.д. Надо только следить, чтобы очередь раньше времени не кончилась
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
17.10.2010, 20:18  [ТС] #25
Я поставил точку с запятой и не работает(((
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
17.10.2010, 20:19 #26
Цитата Сообщение от robert19 Посмотреть сообщение
Я поставил точку с запятой и не работает(((
Ну а какие ошибки пишет компилятор, мне нужно самому догадаться?..
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
17.10.2010, 20:21  [ТС] #27
Вот еще не понятно, зачем там вообще переменная 'а' нужна? я же все равно не ввожу значение которое хочу удалить, а просто первый элемент.

Добавлено через 1 минуту
Цитата Сообщение от Nameless One Посмотреть сообщение
Ну а какие ошибки пишет компилятор, мне нужно самому догадаться?..
А он ошибок не выдает. Просто когда нажимаешь удалить, прога вылетает. Вот код
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
#include <string.h>
#include <iostream>
using namespace std;
class List{
private:
        struct Element{
                int key;
                Element *next;
        };
        Element* pbeg;
        Element* pend;
public:
        List(){
                pbeg = 0;
                pend = 0;
        }
        List& operator <<(int a);
        List& operator >>(int& a);
        void print();
        ~List(){
            Element* temp = pbeg;
            pbeg = pbeg->next;
            delete temp;
            temp = 0; 
        }
};
 
List& List::operator << (int a){
    Element* ph = new Element;
    ph->key = a;
    ph->next = 0;
    if (pend!=0){
        pend->next = ph;
        pend = ph;
    }
    else{
        pbeg = ph;
        pend = ph;
    }
    return *this;
}
List& List::operator>>(int &a){
    a = pbeg->key;
    Element* ph = pbeg;
    pbeg = pbeg->next;
    delete ph;
    return *this;
}
void List::print(){
    while (pbeg != 0){
        Element *ph = pbeg;
        pbeg = pbeg->next;
        cout<<" "<<ph->key;
        cout<<endl;
    }
}
int main(){
    setlocale(LC_ALL,"Russian");
    List w; int b=0,a;
    while(true){
        cout<<"1) Заполнить очередь"<<endl;
        cout<<"2) Вывести на экран"<<endl;
        cout<<"3) Удалить элемент"<<endl;
        cout<<"Ввод: "; cin>>b;
        if (b == 1){
            system("cls");
            cout<<"Введите значение: ";
            cin>>a;
            w<<a;
            system("cls");
        }
        if (b == 2){
            system("cls");
            cout<<"Список: ";
            w.print();
        }
        if (b == 3){
            w>>a;
        }
    }
}
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
17.10.2010, 20:29 #28
Цитата Сообщение от robert19 Посмотреть сообщение
Вот еще не понятно, зачем там вообще переменная 'а' нужна? я же все равно не ввожу значение которое хочу удалить, а просто первый элемент.
В этой переменной сохраняется значение удаляемого элемента очереди:
C++
1
2
3
// Допустим, в голове очереди хранится элемент 5, за ним 6 и т.д.
w >> a; // удалим элемент из головы очереди и поместим его значение в a
// Теперь в голове очереди находится элемент 6, а в переменной a - значение 5
Добавлено через 2 минуты
Цитата Сообщение от robert19 Посмотреть сообщение
Просто когда нажимаешь удалить, прога вылетает.
А к тому моменту, как ты удаляешь элементы, в очереди они вообще есть? Мож она пуста? А у тебя проверки на то, что очередь пуста, вообще нет.

Добавлено через 2 минуты
И да, что у тебя опять случилось с деструктором? Куда делся цикл while?
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
17.10.2010, 20:30  [ТС] #29
Я нашел ошибку. Допустим вводишь значения в очеред 12345. Он нормально записывает. Если сразу после ввода нажать удалить, остануться 2345. Нажмем Вывести на экран, он выведет. После этого если сного попробовать удалить, то вылетит. Потому что после распечатки на экран pbeg уходит в конец. ))
Nameless One
Эксперт С++
5771 / 3420 / 255
Регистрация: 08.02.2010
Сообщений: 7,447
17.10.2010, 20:31 #30
И да, функция print у тебя рушит всю очередь. Замени ее на такую:
C++
1
2
3
4
5
6
7
8
9
10
void print()
{
  Element* temp = pbeg;
  while(temp)
  {
      cout << " " << temp->key;
      temp = temp->next;
  }
  cout << endl;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2010, 20:31
Привет! Вот еще темы с ответами:

Перегрузка операций - C++
Друзья, помогите с перегрузкой некоторых операций, пожалуйста) Задание: Есть угол на плоскости(поля угол и минуты). Перегрузить...

Перегрузка операций - C++
C++ ругается когда я пытаюсь сделать след-ю перегрузку операций. У меня трехмерный массив matrix и в цикле мне нужно использовать не...

Перегрузка операций - C++
Доброго времени суток. Очень нужна помощь программистов. Есть такое задание: Создать класс, который запоминает римские числа в виде...

Перегрузка операций - C++
Начал изучать перегрузку операций, и чего-то вроде не понял или что... Вообщем не могу понять чего не компилит. Проект и ошибка в...


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

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

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