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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 37, средняя оценка - 4.78
Saiberg
19 / 19 / 1
Регистрация: 23.09.2010
Сообщений: 193
#1

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

08.04.2011, 18:49. Просмотров 4752. Ответов 5
Метки нет (Все метки)

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++
Пытаюсь написать программку, но возникла ошибка с выводом информации на экран. Вот мой код: int MAX_ARRAY_SIZE = 2147483647; ...

Перегрузка оператора вывода - C++
Здравствуйте. Я пишу учебную программу реализующая арифметику обыкновенных дробей. И в данный момент перезагружаю оператор вывода. ...

Перегрузка оператора вывода - C++
Здравствуйте. Не могу понять в чем ошибка. При выводе пишет: warning C4717: operator&lt;&lt;: рекурсия на всех путях выполнения, функция вызовет...

Перегрузка оператора вывода - C++
Здравствуйте! Подскажите пожалуйста как можно решить проблему с перегрузкой оператора. В моем коде выдает ошибку: error C2440: '=' :...

Перегрузка оператора вывода - C++
Ребят, привет! Проблемная часть - operator &lt;&lt; если комментировать его вызов в main - сборка осуществляется, иначе - нет. ...

Перегрузка оператора вывода - C++
Здравствуйте. Помогите пожалуйста понять, что нужно передать в качестве параметра при перегрузке оператора вывода? Мне нужно удалить...

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

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

бинарный оператор может быть методом только если, первый его параметр и результат - экземпяр класса методом которого он является.
хм... похоже на правду
silent_1991
Эксперт С++
4960 / 3036 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.04.2011, 19:10     Перегрузка оператора вывода #4
Цитата Сообщение от 'while(i)k++' Посмотреть сообщение
и результат
Это неверно, результат может быть любым и в случае, если операция перегружается как метод класса.
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();
}
почему так не вызывается?(я так вызывать не хочу. это должно происходить неявно)
Токая запись впринцепи работает, только еще какой то мусор в конце выводится%)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2011, 08:38     Перегрузка оператора вывода
Еще ссылки по теме:

Перегрузка оператора вывода - C++
Доброго времени суток. Столкнулся с проблемой: функция перегрузки вывода возвращает некорректное значение. Код вызова перегрузки ...

Перегрузка оператора вывода - C++
Всем привет, может быть глупый вопрос, но по Липманну вообще ничего не понятно, хотя книга для начинающих. Так как я мало знаком с...

Перегрузка оператора вывода - C++
Доброго времени суток. Задача программы: умножение и деление комплексных чисел. Файл number.h #pragma once class number { ...

Перегрузка оператора вывода - C++
Я сотворил одну программку, при выводе первый элемент массива не правильный. Уже перегрузил оператор вывода, но не понимаю что не так....

Перегрузка оператора вывода - C++
Допустим я перегружаю оператор вывода: std::ostream&amp; operator&lt;&lt;(std::ostream&amp; os,Drobi const &amp;d) { ...

Перегрузка оператора ввода вывода - C++
Есть два хэдера(header.h и Array.h) и исполняемая программа main.cpp в которой я как раз и обращаюсь к оператору ввода Array.h ...


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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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     Перегрузка оператора вывода
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru