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

Перегрузка операции ввода/вывода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.02.2013, 21:35     Перегрузка операции ввода/вывода #1
В лабораторной говорится: "Перегрузить операции ввода и вывода 2 способами: внутренним и внешним". Что такое внешним я представляю, а внутренний - это как?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ITcrusader
Эксперт C++
 Аватар для ITcrusader
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
28.02.2013, 21:39     Перегрузка операции ввода/вывода #2
Внутренний - это как член класса.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.02.2013, 21:50  [ТС]     Перегрузка операции ввода/вывода #3
ITcrusader, не могли бы пример?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 22:09     Перегрузка операции ввода/вывода #4
Перегрузка оператора
Там, в первом посте, + перегружается в классе.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.02.2013, 22:50  [ТС]     Перегрузка операции ввода/вывода #5
alsav22, то перегрузка +. Это элементарно. А вот как перегрузить ввод/вывод внутри?

Добавлено через 7 минут
Загвоздка именно со словом "внутри". Это тогда уже не будет cout << obj; А как?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 22:58     Перегрузка операции ввода/вывода #6
Цитата Сообщение от Kgfq Посмотреть сообщение
А вот как перегрузить ввод/вывод внутри?
Также.
Цитата Сообщение от Kgfq Посмотреть сообщение
Загвоздка именно со словом "внутри".
Внутри, я так понимаю, - значит в классе.

Добавлено через 2 минуты
И поподробней, как вопрос формулируется в лаб-ой. Перегрузить для кого-чего сказано?
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.02.2013, 23:01  [ТС]     Перегрузка операции ввода/вывода #7
alsav22, цитирую:

"
Вид перегрузки операций ввода и вывода
Внешняя
Внутренняя
"

Если перегрузить << скажем внутри класса, то написать cout << obj не получится. Хотя бы потому, что cout не умеет его принимать
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 23:10     Перегрузка операции ввода/вывода #8
Цитата Сообщение от Kgfq Посмотреть сообщение
Хотя бы потому, что cout не умеет его принимать
Для того и пишется перегрузка, чтобы умел.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.02.2013, 23:12  [ТС]     Перегрузка операции ввода/вывода #9
alsav22, так тогда нужно перегружать вне, а не внутри
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 23:24     Перегрузка операции ввода/вывода #10
Это как метод класса(внутри):
C++
1
2
3
4
5
ostream& operator<<(ostream& out)
{
     out << *this;
     return out;
}
Это как дружественная функция(снаружи, для объектов класса A):
C++
1
2
3
4
5
friend ostream& operator<<(ostream& out, const A& obj)
{
    out << obj;
    return out;
}
Добавлено через 5 минут
Цитата Сообщение от Kgfq Посмотреть сообщение
alsav22, так тогда нужно перегружать вне, а не внутри
Чтобы так писать: cout << obj;, то вне. Если внутри, то писать нужно так: obj << cout; Непривычно, но работать будет правильно. Чтобы было привычно, перегрузку делают в виде дружественной фнкции.

Добавлено через 3 минуты
Цитата Сообщение от Kgfq Посмотреть сообщение
alsav22, цитирую:
"
Вид перегрузки операций ввода и вывода
Внешняя
Внутренняя
"
Я спросил: для кого-чего перегрузка написано? Для класса?
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
28.02.2013, 23:28     Перегрузка операции ввода/вывода #11
Если я не ошибаюсь, то перегружений оператор ввода/вывода не может быть членом класса!
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
28.02.2013, 23:31  [ТС]     Перегрузка операции ввода/вывода #12
Цитата Сообщение от alsav22 Посмотреть сообщение
Я спросил: для кого-чего перегрузка написано? Для класса?
Походу, да

obj << cout - до этого я довел, но уж больно непривычно
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 23:31     Перегрузка операции ввода/вывода #13
Ошибаетесь, очень даже может. 10 пост, первый код. Только синтаксис при использовании будет непривычным. obj << cout;
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
28.02.2013, 23:34     Перегрузка операции ввода/вывода #14
Тогда почему не хочет компилировать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
using namespace std;
class A
{
    ostream& operator<<(ostream& out)
{
     out << *this;
     return out;
}
};
 
int main()
{}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 23:46     Перегрузка операции ввода/вывода #15
Что пишет?
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
28.02.2013, 23:47     Перегрузка операции ввода/вывода #16
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
------ Построение начато: проект: Array, Конфигурация: Debug Win32 ------
  main.cpp
d:\динамічний_масив\динамічний_масив\main.cpp(8): error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "A" (или приемлемое преобразование отсутствует)
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(679): может быть "std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(726): или       "std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(764): или       "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(811): или       "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(937): или       "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const signed char *)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(944): или       "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed char)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(951): или       "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const unsigned char *)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(958): или       "std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,unsigned char)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(968): или       "std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>,A>(std::basic_ostream<_Elem,_Traits> &&,_Ty)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>,
              _Ty=A
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(1085): или       "std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const std::error_code &)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(186): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ostream<_Elem,_Traits> &(__cdecl *)(std::basic_ostream<_Elem,_Traits> &))"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(192): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(199): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(206): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(226): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(short)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(260): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(280): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(305): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned int)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(325): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(345): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned long)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(366): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__int64)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(386): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(407): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(float)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(427): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(double)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(447): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long double)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(467): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(const void *)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          c:\program files\microsoft visual studio 10.0\vc\include\ostream(487): или       "std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_streambuf<_Elem,_Traits> *)"
          with
          [
              _Elem=char,
              _Traits=std::char_traits<char>
          ]
          при попытке сопоставить список аргументов "(std::ostream, A)"
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 23:52     Перегрузка операции ввода/вывода #17
Как используете << с объектом класса покажите. Выше написано как нужно: obj << cout, а вы наверное пишите: cout << obj;

Добавлено через 1 минуту
B перегрузку в public раздел поместите.
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
28.02.2013, 23:55     Перегрузка операции ввода/вывода #18
О теперь все нормально! Даже не думал что так можно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
class A
{
public:
    int a;
    A(){a=2;}
    ostream& operator<<(ostream& out)
{
     out << a;
     return out;
}
};
 
int main()
{
    A a;
    a<<cout;
    system("pause");
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.03.2013, 00:31     Перегрузка операции ввода/вывода
Еще ссылки по теме:

Перегрузка операторов ввода-вывода C++
C++ Шаблоны перегрузка ввода/вывода
Перегрузка операции вывода C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.03.2013, 00:31     Перегрузка операции ввода/вывода #19
Вы правильно меня исправили. В 10 посте я неверно написал. Нужно так: если в классе A есть поле x, то
C++
1
2
3
4
5
6
7
8
9
10
11
ostream& operator<<(ostream& out)
{
   out << x;
   return out;
}
 
friend ostream& operator<<(ostream& out, const A& obj)
{
    out << obj.x;
    return out;
}
Yandex
Объявления
01.03.2013, 00:31     Перегрузка операции ввода/вывода
Ответ Создать тему
Опции темы

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