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

перегрузка оператора вывода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.78
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
08.04.2011, 18:49     перегрузка оператора вывода #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct SomeStruct { 
 
    std::ostream& operator<< (std::ostream& s/*, SomeStruct&*/) { return s << "123"; };
};
 
 
 
int main() {
    
    SomeStruct someStruct;
    std::cout << someStruct;
 
    std::cin.get();
}
не совсем понятно почему так делать нельзя

C++
1
2
3
4
5
struct SomeStruct { 
 
    
};
std::ostream& operator<< (std::ostream& s, SomeStruct&) { return s << "123"; };
так работает
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.04.2011, 18:49     перегрузка оператора вывода
Посмотрите здесь:

Перегрузка оператора вывода в поток C++
C++ Перегрузка оператора вывода
C++ Перегрузка оператора вывода
Перегрузка оператора вывода C++
Перегрузка оператора ввода вывода C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
while(i)k++
48 / 48 / 5
Регистрация: 13.08.2010
Сообщений: 160
08.04.2011, 19:00     перегрузка оператора вывода #2
бинарный оператор может быть методом только если, первый его параметр и результат - экземпяр класса методом которого он является, компилятор для нахождения того что ему надо вызывать будет смотреть, в класс ostream)), обще обще принято бинарные операторы делать функциями, если нужен доступ к закрытым полям обьекта то фрэнд функциями

помоему так, давно не писал на Срр и компилятора под рукой нет дабы проверить
struct SomeStruct {
friend std::ostream& operator<< (std::ostream& s, SomeStruct&);

};
std::ostream& operator<< (std::ostream& s, SomeStruct&) { return s << "123"; };
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
08.04.2011, 19:06  [ТС]     перегрузка оператора вывода #3
то, что вы написали работать будет.

бинарный оператор может быть методом только если, первый его параметр и результат - экземпяр класса методом которого он является.
хм... похоже на правду
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
08.04.2011, 19:10     перегрузка оператора вывода #4
Цитата Сообщение от 'while(i)k++' Посмотреть сообщение
и результат
Это неверно, результат может быть любым и в случае, если операция перегружается как метод класса.
Saiberg
 Аватар для Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
09.04.2011, 08:26  [ТС]     перегрузка оператора вывода #5
думал думал. все таки не понятно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
struct SomeStruct { 
 
        std::ostream& operator<< (std::ostream& s) { return s << "123"; };
};
 
 
 
int main() {
        
        SomeStruct someStruct;
        std::cout << someStruct.operator<<(std::cout);
 
        std::cin.get();
}
почему так не вызывается?(я так вызывать не хочу. это должно происходить неявно)
Токая запись впринцепи работает, только еще какой то мусор в конце выводится%)
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.04.2011, 08:38     перегрузка оператора вывода #6
Цитата Сообщение от Saiberg Посмотреть сообщение
почему так не вызывается?
Потому, что оператор сдвига описан как метод структуры, т.е. первым параметром будет указатель на эту структуру:
C++
1
2
//как-бы
std::ostream& operator<< (SomeStruct * this, std::ostream& s) { return s << "123"; };
Соответственно для его вызова слева должен быть указатель на структуру, а справа - поток.
Но даже не пробуйте так написать.)

Добавлено через 1 минуту
Цитата Сообщение от Saiberg Посмотреть сообщение
std::cout << someStruct.operator<<(std::cout);
Выводите в поток этот самый поток.
Yandex
Объявления
09.04.2011, 08:38     перегрузка оператора вывода
Ответ Создать тему
Опции темы

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