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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.67
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
17.10.2010, 16:52     Перегрузка операций '<<' и '>>' #1
Добрый вечер всем
У меня вот такое задание:
Создайте класс, реализующий однонаправленную очередь. В интерфейс класса должны входить перегруженные операции:
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++ Перегрузка операций << и >>
перегрузка операций C++
C++ перегрузка операций
Перегрузка операций C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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;
}
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
17.10.2010, 20:31  [ТС]     Перегрузка операций '<<' и '>>' #31
Забыл его написать)))
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
17.10.2010, 20:35     Перегрузка операций '<<' и '>>' #32
Цитата Сообщение от robert19 Посмотреть сообщение
Я нашел ошибку. Допустим вводишь значения в очеред 12345. Он нормально записывает. Если сразу после ввода нажать удалить, остануться 2345. Нажмем Вывести на экран, он выведет. После этого если сного попробовать удалить, то вылетит. Потому что после распечатки на экран pbeg уходит в конец. ))
Все из-за кривой функции print

Теперь-то хоть работает?

Я забыл инициализировать temp в функции 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:39     Перегрузка операций '<<' и '>>'
Еще ссылки по теме:

C++ Перегрузка операций
Перегрузка операций C++
C++ Перегрузка операций

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

Или воспользуйтесь поиском по форуму:
robert19
25 / 25 / 3
Регистрация: 26.03.2010
Сообщений: 305
17.10.2010, 20:39  [ТС]     Перегрузка операций '<<' и '>>' #33
Цитата Сообщение от Nameless One Посмотреть сообщение
void print()
{
Element* temp;
while(temp)
{
cout << " " << temp->key;
temp = temp->next;
}
cout << endl;
}
здесь еще нужно было Element* temp=pbeg;
Спасибо огромное за помощь))
Да теперь все тип-топ. Блин супер))))
Yandex
Объявления
17.10.2010, 20:39     Перегрузка операций '<<' и '>>'
Ответ Создать тему
Опции темы

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