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

Переопределить оператор << в классе - C++

Восстановить пароль Регистрация
 
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
08.10.2012, 17:54     Переопределить оператор << в классе #1
Добрый день.

Не пойму как переопределить оператор << для моего класса

Пробую так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
class MyClass
{
public:
 
    MyClass(){}
 
    ~MyClass(){}
 
    std::ostream& operator<< (std::ostream sto, MyClass mycl) 
    {
         return sto << "operator <<";
    }
 
};
 
// в функции main
MyClass mycl;
std::cout << mycl;
Пишут ошибку
no match for 'operator<<' in 'std::cout << mycl'

Не подскажите что не так?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
08.10.2012, 17:57     Переопределить оператор << в классе #2
вынеси перегрузку из класса
wtf?
19 / 19 / 0
Регистрация: 03.10.2010
Сообщений: 48
08.10.2012, 17:57     Переопределить оператор << в классе #3
Если использовать твой тогда нужно писать так:
C++
1
mycl << std::cout;
Если хочешь нормальный тогда делай глобальную перегрузку, и если ей нужен доступ к закрытым членам класса обьявляй её френдом
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.10.2012, 17:58     Переопределить оператор << в классе #4
C++
1
2
3
4
5
    friend std::ostream& operator<< (std::ostream& sto, const MyClass& mycl) 
    {
         sto << "operator <<";
         return sto;
    }
fixed.
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
08.10.2012, 18:20  [ТС]     Переопределить оператор << в классе #5
Вот как оно значит.
А скажите - этот нюанс с френдом касается только перегрузки операторов классов? Можете дать ссылку на стандарт, где об этом написано?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
08.10.2012, 18:31     Переопределить оператор << в классе #6
Neumann1, Аж на стандарт? оО
Операторы могут быть унарные/бинарные/n-арные (оператор () ). В частности оператор << - бинарный оператор, если определять в классе - можно передать только один свой параметр, ибо первый параметр в любом случае будет this, если свободная функция соответственно два параметра (ссылка на поток + константная ссылка на объект класса). Если friend - единственное отличие от свободной - имеет доступ к закрытой части класса. Собственно в стандарте это все естественно описано, просто откройте стандарт и почитайте, в частности разделы 9-13.
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
08.10.2012, 22:49  [ТС]     Переопределить оператор << в классе #7
Прочитал ваш комментарий, потом прочитал про friend у Страуструпа (не в стандарте, а в "Язык прог-ия С++"), все равно до конца не пойму. А хочется понять.
Вот эта часть книги (но другими словами - наверное другое издание)
Следовательно операция, изменяющая состояние объекта класса,
должна быть членом или глобальной функцией с параметром-ссылкой
без спецификации const. Операции над основными типами, которые
требуют в качестве операндов адреса (=, *, ++ и т.д.),
для пользовательских типов естественно определять как члены.
Обратно, если требуется неявное преобразование типа для всех
операндов некоторой операции, то реализующая ее функция должна
быть не членом, а глобальной функцией и иметь параметр типа ссылки
со спецификацией const или нессылочный параметр. Так обычно обстоит
дело с функциями, реализующими операции, которые для основных
типов не требуют адресов в качестве операндов (+, -, || и т.д.).
под глобальными здесь имеются ввиду френды, там потом в примерах так.
У меня в книге лучше написано, но здесь тоже самое.

Но я не пойму соль.
Вот если я объявлю функцию-член например
C++
1
2
3
4
5
6
7
8
class MyClass
{
 
//
     void f(int arg1, char arg2){}
//
 
}
то никаких проблем, что у функции-члена два аргумента нет! Всё норм.
А если именно переопределяю оператор, то я должен смотреть - бинарный он или унарный (соответственно два или один аргумент). Почему? Почему не могу переопределить оператор с двумя аргументами как функцию-член?

Я не хочу принимать как данность, я хочу понять причину.
AnreyKazakov
Заблокирован
08.10.2012, 23:37     Переопределить оператор << в классе #8
Буквально на днях в книжке читал...
При определении оператора не может быть изменен ни его приоритет, ни порядок, ни количество операндов, тут же оговорка, что порядок выполненеия || и && не предсказуем, видимо undefinit или как там я не знаю англ... ну и наверно еще много оговорок всяк разных...
А вот с чем связана такая данность для самого загадка.... Но больше конечно бесят всякие вот такие неопределенности, в особенности i+=i+ ++i; всякая такая белеберда, просто бесит, ибо х з что выдаст компиль.
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
09.10.2012, 10:07  [ТС]     Переопределить оператор << в классе #9
типа такого?)
i = i++ + ++i
а мне нравится - как спортивный интерес.
Да, в разных компиляторах по разному, undefined behavior вроде.

А по теме - вопрос еще открыт! )
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.10.2012, 10:37     Переопределить оператор << в классе #10
Neumann1, Так указано в стандарте. Так решили авторы языка. Так логично. У каждого оператора, кроме () есть арность, арность нарушать/переопределять нельзя.
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
09.10.2012, 10:40  [ТС]     Переопределить оператор << в классе #11
Не, если они так решили, то я не против. Но я не понимаю, почему логично) почему?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.10.2012, 11:26     Переопределить оператор << в классе #12
Neumann1, Ну. Кхм. Вот есть у нас оператор присваивания. В чем логика, если он будет не бинарным? Есть у нас оператор инкремента, в чем логика если он будет не унарным? Оператор *, -> аналогично.
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
09.10.2012, 11:39  [ТС]     Переопределить оператор << в классе #13
Не, то что какой-то оператор унарный или бинарный, это я понимаю. Оператор << естественно бинарный. Но почему эта его бинарность обязывает меня реализовать его как friend?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.10.2012, 12:01     Переопределить оператор << в классе #14
Neumann1, Потому что первый параметр функции-члена - указатель на объект данного класса. Нету обязательства реализовывать его как friend. Бывает нужно, чтобы оператор вывода в поток был именно членом класса. Но если первым параметром должен быть не объект данного класса, а к примеру ostream - тогда либо свободная функция, либо friend.
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
09.10.2012, 13:13  [ТС]     Переопределить оператор << в классе #15
ForEveR,
Потому что первый параметр функции-члена - указатель на объект данного класса."
Вот этот момент я и не понимаю - где этот this и почему он в функциях-членах.

Вот два примера:

void f(int arg1, char arg2)

std::ostream& operator<< (std::ostream& sto, const MyClass& mycl)

Где в обоих случаях this? Разве первый параметр не является потоком вывода?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
09.10.2012, 13:46     Переопределить оператор << в классе #16
Neumann1, Эм.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class C
{
public:
   // Практически эквивалентно void f(C* const this)
   void f();
   // Вообщем-то бессмысленно, ибо эквивалентно
   // std::ostream& operator << (C* const this, const C&);
   std::ostream& operator << (const C&);
   // Никакого this тут нет. Тоже самое, что свободная функция,
   // но имеет право доступа не только в паблик данным класса.
   friend std::ostream& operator << (std::ostream&, const C&);
};
 
// Обычная свободная функция.
std::ostream& operator << (std::ostream&, const C&);
Neumann1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 30
09.10.2012, 14:53  [ТС]     Переопределить оператор << в классе #17
Вот он, краеугольный камень.
Когда вы впервые сказали про this, я подумал о чем-то таком.
Теперь я понял. Буду знать - если функция-член, то невидимый первый параметр - константный указатель на класс.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2012, 20:59     Переопределить оператор << в классе
Еще ссылки по теме:

C++ Как в классе перегрузить оператор двойного индексирование?
C++ Шаблонный оператор присваивания в шаблонном классе
C++ Как переопределить оператор ++ типа char?

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
09.10.2012, 20:59     Переопределить оператор << в классе #18
Neumann1, весь топик не читал, но прозвучал вопрос "почему именно френд?" Так вот, не обязательно. Если оператор << сможет до всех необходимых ему данных через публичные методы (проще говоря, через интерфейс) класса - то делать его другом не нужно. Френд тут нужен для того, чтобы напрямую обращаться к сокрытым полям или методам класса, т.е., по большому счёту, нарушать инкапсуляцию.
Yandex
Объявления
09.10.2012, 20:59     Переопределить оператор << в классе
Ответ Создать тему
Опции темы

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