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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 135, средняя оценка - 4.73
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.02.2010, 07:56     Перегрузка ввода/вывода в/из потока #1
Никогда потоками не пользовался, поэтому не знаю. Как перегрузить для ввода из потока оператор
C++
1
operator >>
? Как перегрузить для вывода в поток оператор
C++
1
operator >>
? Какие они должны возвращать типы? Как выглядят прототипы? Учесть, что вводу/выводу подлежат закрытые поля объектов класса, для которого требуется перегрузить операторы.

Добавлено через 6 минут
Так:
C++
1
friend istream operator >> (istream &Stream, MyClass &String);
правильно?

Добавлено через 1 минуту
А так:
C++
1
friend ostream operator << (ostream &Stream, MyClass &String);
?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2010, 07:56     Перегрузка ввода/вывода в/из потока
Посмотрите здесь:

Перегрузка операторов ввода/вывода. C++
C++ Перегрузка потока ввода
Перегрузка операторов ввода вывода C++
Перегрузка потокового ввода/вывода C++
C++ Перегрузка операций ввода/вывода
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HIMen
 Аватар для HIMen
4105 / 1354 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
19.02.2010, 08:02     Перегрузка ввода/вывода в/из потока #2
C++
1
2
3
4
5
6
friend ostream& operator << (ostream &stream, MyClass &obj)
{
    stream << obj.value ...;
    ...
    return stream;
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.02.2010, 09:52  [ТС]     Перегрузка ввода/вывода в/из потока #3
Спасибо. А можно в теле перегруженного оператора ввода, не используя стандартные классы строк, ввести строку одним оператором?
HIMen
 Аватар для HIMen
4105 / 1354 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
19.02.2010, 10:08     Перегрузка ввода/вывода в/из потока #4
Цитата Сообщение от taras atavin Посмотреть сообщение
Спасибо. А можно в теле перегруженного оператора ввода, не используя стандартные классы строк, ввести строку одним оператором?
Не понятно, как это одним параметром
C++
1
2
3
4
5
6
friend istream& operator >> (istream &stream, MyClass &obj)
{
    stream >> obj.value1;
    stream >> obj.value2;   
    return stream;
}
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.02.2010, 10:17  [ТС]     Перегрузка ввода/вывода в/из потока #5
Строку, а не поля. А на поля я хочу сам разобрать. Иначе как я введу, например, <12.3+48.6i>?
C++
1
Stream>>Com.re; Stream>>Com.im; Stream c;
? А если с клавы (параметр Stream - это ссылка на cin) поступило <48.6i+12.3>? Менять тело оператора на
C++
1
Stream>>Com.im; Stream c; Stream>>Com.im;
? По какому, интересно, признаку это можно сделать? Ладно, если целиком строку ввести нельзя, то как задать условие для цикла типа
C++
1
2
3
4
5
while (...)
{
 Stream>>c;
 ...
}
(
C++
1
char c;
)?

Добавлено через 1 минуту
Комплекс в данном случае просто пример.
HIMen
 Аватар для HIMen
4105 / 1354 / 39
Регистрация: 12.04.2009
Сообщений: 2,346
19.02.2010, 10:23     Перегрузка ввода/вывода в/из потока #6
Проще всего со строкой, #include <string>
Как вспомню работу с с-строками ...
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
19.02.2010, 12:06  [ТС]     Перегрузка ввода/вывода в/из потока #7
Цитата Сообщение от HIMen Посмотреть сообщение
Как вспомню работу с с-строками
как раз проще, чем гадать: "Под Мелкософтом CString, а под Болэндом TString, или наоборот, как этот класс обозван в gcc, кто его ваще делал и как точно по стандарту выглядит интерфейс доступа к отдельному символу?". Альтернатива - свой класс строк, но я и для него не могу перегрузить ввод из потока.

Добавлено через 1 час 36 минут
Мне только условие завершения, или как ввести сразу c-строку, смотря что проще. А остальное я сам, в обработке таких строк как раз никаких сложностей не вижу.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
19.02.2010, 17:07     Перегрузка ввода/вывода в/из потока #8
Чтобы не гадать, надо пользоваться <string>, который есть везде, ибо часть стандарта.
Amarted
 Аватар для Amarted
157 / 19 / 2
Регистрация: 26.02.2010
Сообщений: 56
26.02.2010, 20:05     Перегрузка ввода/вывода в/из потока #9
А у меня с перегрузкой операторов ввода/вывода такая проблема

простейший класс

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class myClass
{
public:
    myClass() { itsValue = 0; };
    ~myClass();
 
    int GetValue(){ return itsValue; };
 
    friend ostream& operator<<( ostream&os, const myClass&rhs )
    { return os<<rhs.GetValue(); }
    friend istream& operator>>( istream& is, myClass& rfs )
    { return is >> rfs.GetValue() ; };  
 
private:
    int itsValue;
};
при попытке использовать cout<< либо cin>>в основной программе использующей класс ? компилятор выдает
C++
1
2
3
4
5
6
7
8
9
Compiling...
main.cpp
myClass.cpp
I:\!!WRK\Programming\c++\MyProjects_\Tested\myClass.cpp(26) : error C2662: 'GetValue' : cannot convert 'this' pointer from 'const class myClass' to 'class myClass &'
        Conversion loses qualifiers
I:\!!WRK\Programming\c++\MyProjects_\Tested\myClass.cpp(33) : error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'int' (or there is no acceptable conversion)
Error executing cl.exe.
 
Tested.exe - 2 error(s), 0 warning(s)
причем если я переношу itsValue в public, и вместо
C++
1
2
3
4
// ...
{ return os<<rhs.GetValue(); }
// ...
{ return is>>rhs.GetValue(); }
пишу
C++
1
2
3
4
// ...
{ return os<<rhs.itsValue; }
// ...
{ return is>>rhs.itsValue; }
все работает окей. Возникает вопрос, то ли лыжы не едут, то ли я еду по асфальту?
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
27.02.2010, 06:28  [ТС]     Перегрузка ввода/вывода в/из потока #10
Цитата Сообщение от Nick Alte Посмотреть сообщение
Чтобы не гадать, надо пользоваться <string>, который есть везде, ибо часть стандарта.
. Как раз гадание вызывается использованием стандартных строк.

Добавлено через 5 минут
Просто запостите сюда получение числа введённых символов, или определение того, является ли только что прочитанный символ последним. А остальное я сделаю сам. Это в любом случае проще самостоятельного перевода стандарта, даже если бы фирмы и не свои отличия в имя класса строк.
Amarted
 Аватар для Amarted
157 / 19 / 2
Регистрация: 26.02.2010
Сообщений: 56
28.02.2010, 17:09     Перегрузка ввода/вывода в/из потока #11
В итоге сам себе помог, выход был прост, перегрузка функции GetValue()
C++
1
2
int GetValue()const{ return itsValue; };
int& GetValue(){ return itsValue; };
Добавлено через 2 часа 15 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
Так:
Код C++1 friend istream operator >> (istream &Stream, MyClass &String);
правильно?
Добавлено через 1 минуту
А так:
Код C++1 friend ostream operator << (ostream &Stream, MyClass &String);
?
правильно только правильнее так
C++
1
friend ostream operator << (ostream &Stream, const MyClass &String);
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
01.03.2010, 06:10  [ТС]     Перегрузка ввода/вывода в/из потока #12
Цитата Сообщение от Amarted Посмотреть сообщение
В итоге сам себе помог, выход был прост, перегрузка функции GetValue()
. Это кому? И о чём? Об определении числа символов?
Amarted
 Аватар для Amarted
157 / 19 / 2
Регистрация: 26.02.2010
Сообщений: 56
05.03.2010, 16:16     Перегрузка ввода/вывода в/из потока #13
это ктому что в посте #9 я задал вопрос а в посте #11 сам себе ответил... вот такая вот помощь товарищи...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.03.2010, 07:51     Перегрузка ввода/вывода в/из потока
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.03.2010, 07:51  [ТС]     Перегрузка ввода/вывода в/из потока #14
Цитата Сообщение от taras atavin Посмотреть сообщение
riend ostream operator << (ostream &Stream, MyClass &String);
. Выдаёт какоето предупреждение.
Yandex
Объявления
23.03.2010, 07:51     Перегрузка ввода/вывода в/из потока
Ответ Создать тему
Опции темы

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