1 / 1 / 0
Регистрация: 20.09.2012
Сообщений: 30
|
||||||
1 | ||||||
Переопределить оператор << в классе08.10.2012, 17:54. Показов 2159. Ответов 17
Метки нет Все метки)
(
Добрый день.
Не пойму как переопределить оператор << для моего класса Пробую так
no match for 'operator<<' in 'std::cout << mycl' Не подскажите что не так?
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
|
|
08.10.2012, 17:54 | |
Ответы с готовыми решениями:
17
Как переопределить функцию func2 в классе B Как переопределить перегруженную функцию в производном классе? Как можно переопределить <обобщенный аргумент> в обобщенном классе
|
74 / 37 / 3
Регистрация: 23.09.2012
Сообщений: 408
|
|
08.10.2012, 17:57 | 2 |
вынеси перегрузку из класса
0
|
19 / 19 / 13
Регистрация: 03.10.2010
Сообщений: 48
|
||||||
08.10.2012, 17:57 | 3 | |||||
Если использовать твой тогда нужно писать так:
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
08.10.2012, 17:58 | 4 | |||||
0
|
1 / 1 / 0
Регистрация: 20.09.2012
Сообщений: 30
|
|
08.10.2012, 18:20 [ТС] | 5 |
Вот как оно значит.
А скажите - этот нюанс с френдом касается только перегрузки операторов классов? Можете дать ссылку на стандарт, где об этом написано?
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
08.10.2012, 18:31 | 6 |
Neumann1, Аж на стандарт? оО
Операторы могут быть унарные/бинарные/n-арные (оператор () ). В частности оператор << - бинарный оператор, если определять в классе - можно передать только один свой параметр, ибо первый параметр в любом случае будет this, если свободная функция соответственно два параметра (ссылка на поток + константная ссылка на объект класса). Если friend - единственное отличие от свободной - имеет доступ к закрытой части класса. Собственно в стандарте это все естественно описано, просто откройте стандарт и почитайте, в частности разделы 9-13.
1
|
1 / 1 / 0
Регистрация: 20.09.2012
Сообщений: 30
|
||||||
08.10.2012, 22:49 [ТС] | 7 | |||||
Прочитал ваш комментарий, потом прочитал про friend у Страуструпа (не в стандарте, а в "Язык прог-ия С++"), все равно до конца не пойму. А хочется понять.
Вот эта часть книги (но другими словами - наверное другое издание) У меня в книге лучше написано, но здесь тоже самое. Но я не пойму соль. Вот если я объявлю функцию-член например
А если именно переопределяю оператор, то я должен смотреть - бинарный он или унарный (соответственно два или один аргумент). Почему? Почему не могу переопределить оператор с двумя аргументами как функцию-член? Я не хочу принимать как данность, я хочу понять причину.
0
|
Заблокирован
|
|
08.10.2012, 23:37 | 8 |
Буквально на днях в книжке читал...
При определении оператора не может быть изменен ни его приоритет, ни порядок, ни количество операндов, тут же оговорка, что порядок выполненеия || и && не предсказуем, видимо undefinit или как там я не знаю англ... ну и наверно еще много оговорок всяк разных... А вот с чем связана такая данность для самого загадка.... Но больше конечно бесят всякие вот такие неопределенности, в особенности i+=i+ ++i; всякая такая белеберда, просто бесит, ибо х з что выдаст компиль.
0
|
1 / 1 / 0
Регистрация: 20.09.2012
Сообщений: 30
|
|
09.10.2012, 10:07 [ТС] | 9 |
типа такого?)
i = i++ + ++i а мне нравится - как спортивный интерес. Да, в разных компиляторах по разному, undefined behavior вроде. А по теме - вопрос еще открыт! )
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
09.10.2012, 10:37 | 10 |
Neumann1, Так указано в стандарте. Так решили авторы языка. Так логично. У каждого оператора, кроме () есть арность, арность нарушать/переопределять нельзя.
0
|
1 / 1 / 0
Регистрация: 20.09.2012
Сообщений: 30
|
|
09.10.2012, 10:40 [ТС] | 11 |
Не, если они так решили, то я не против. Но я не понимаю, почему логично) почему?
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
09.10.2012, 11:26 | 12 |
Neumann1, Ну. Кхм. Вот есть у нас оператор присваивания. В чем логика, если он будет не бинарным? Есть у нас оператор инкремента, в чем логика если он будет не унарным? Оператор *, -> аналогично.
0
|
1 / 1 / 0
Регистрация: 20.09.2012
Сообщений: 30
|
|
09.10.2012, 11:39 [ТС] | 13 |
Не, то что какой-то оператор унарный или бинарный, это я понимаю. Оператор << естественно бинарный. Но почему эта его бинарность обязывает меня реализовать его как friend?
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
09.10.2012, 12:01 | 14 |
Neumann1, Потому что первый параметр функции-члена - указатель на объект данного класса. Нету обязательства реализовывать его как friend. Бывает нужно, чтобы оператор вывода в поток был именно членом класса. Но если первым параметром должен быть не объект данного класса, а к примеру ostream - тогда либо свободная функция, либо friend.
0
|
1 / 1 / 0
Регистрация: 20.09.2012
Сообщений: 30
|
|
09.10.2012, 13:13 [ТС] | 15 |
ForEveR,
Вот два примера: void f(int arg1, char arg2) std::ostream& operator<< (std::ostream& sto, const MyClass& mycl) Где в обоих случаях this? Разве первый параметр не является потоком вывода?
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
09.10.2012, 13:46 | 16 | |||||
Neumann1, Эм.
1
|
1 / 1 / 0
Регистрация: 20.09.2012
Сообщений: 30
|
|
09.10.2012, 14:53 [ТС] | 17 |
Вот он, краеугольный камень.
Когда вы впервые сказали про this, я подумал о чем-то таком. Теперь я понял. Буду знать - если функция-член, то невидимый первый параметр - константный указатель на класс.
0
|
![]() 5047 / 3108 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
|
|
09.10.2012, 20:59 | 18 |
Neumann1, весь топик не читал, но прозвучал вопрос "почему именно френд?" Так вот, не обязательно. Если оператор << сможет до всех необходимых ему данных через публичные методы (проще говоря, через интерфейс) класса - то делать его другом не нужно. Френд тут нужен для того, чтобы напрямую обращаться к сокрытым полям или методам класса, т.е., по большому счёту, нарушать инкапсуляцию.
0
|
09.10.2012, 20:59 | |
Помогаю со студенческими работами здесь
18
Как создать виртуальный поток и переопределить оператор <<? Перегруженный оператор = в классе String Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |