быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
|
|||||||||||
1 | |||||||||||
Как создать виртуальный поток и переопределить оператор <<?02.01.2011, 02:48. Показов 3916. Ответов 21
Метки нет Все метки)
(
Виртуальный то есть имеется ввиду не файловый и не строковый и не консольный.
Впрочем, создание сего не противоречит синтаксису. Вот, например, тут написано про поток ostream и про оператор << Так а теперь мой код:
Как неизвестные? Всё известно. Вот, идём по сссылке и видим один из вариантов (мой)
0
|
|
02.01.2011, 02:48 | |
Ответы с готовыми решениями:
21
Как можно сделать виртуальный поток ввода / вывода? Переопределить поток вывода cout |
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
02.01.2011, 12:49 | 2 |
kravam, У ostream нету конструктора без параметров.
Надо работать с указателем на класс производный от streambuf, разобраться с ним, и подать его в параметр потока.
0
|
rangerx
|
|||||
02.01.2011, 14:30
#3
|
|||||
Не по теме:
0
|
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
|
|||||||||||
02.01.2011, 15:37 [ТС] | 4 | ||||||||||
Короче, мне непонятна общая концепция тык скыть. Чё надо делать.
Вот у меня имеется список list<char>, он корректен. И вот у меня имеется класс "большие числа". И вот мне этот список надо в это большое число загнать. Дабы не писать ЛИШНЕГО, пробую обойтись имеющимися средствами. Вот у класса "большие числа" есть такой оператор перенаправления:
список---> поток---> большое число (ну или двусточная операция пусть будет, щас это невжно) Так, вот первая задача 1) пробую загнать список в поток. Для list такого оператора нет! Вот тут мне непонятно чё делать 2) я умею вывести list на консоль вот так, и думаю, может этот способ как-то использовать?
3) НО тут встаёт ещё одна задача. Если я сделаю так, то list направится в поток который имеет тип ofstream Но из потока типа ofsream мне в большое число ничё не направить, ибо там должен быть тип iofstream! Напомню: istream & operator>> (istream &s, Verylong &v) Ну вот, пытался понятно изложить суть проблемы, хотя я сам запутался уже. Надеюсь тык скыть на помощь
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
02.01.2011, 16:50 | 5 | |||||
kravam, 1) Не совсем понятно. Что значит "загнать список в поток"? В поток ввода или в поток вывода? Как вариант сделать класс производный от std::list. И для него перегрузить оператор ввода/вывода. Ну а можно просто через copy - ибо copy через istream_iterator к примеру может и вводить последовательность, а не только выводить.
2) ... 3) ifstream класс производный от istream. Добавлено через 6 минут
0
|
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
|
|||||||||||
02.01.2011, 17:34 [ТС] | 6 | ||||||||||
мне нужно загнать лист в поток, который мне всё равно как называется (наверное, двунаправленный)из которого я мог бы перегнать содержание в класс "большие числа", вот оператор ">>" для больших чисел:
Вот насчёт copy, я всё думал и до сих пор думаю, как мне с её помощью скопировать список в нужный поток (определение потока см. выше). Вот copy копирует лист в консольный поток:
OutputIterator А не InputIterator
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
02.01.2011, 17:42 | 7 | |||||
kravam, Эм.
0
|
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
|
||||||
02.01.2011, 17:57 [ТС] | 8 | |||||
ForEveR,
Я понимаю, Новый Год и всё такое. С праздником, кстати. Значит. На консоль я данные могу вывести. Даже из текстового файла. И даже условно (!) говоря из консоли в консоль как в предыдущем примере. Но мне на консоль НЕ НАДО. Задача чуть-чуть сложнее. Если не решается по какой-то причине- ну ладно. Задача вывести (или ввести, но дело не в названии ведь) данные из списка в поток. Я так понимаю, мне нужно ответить на вопрос- какой поток? Я не знаю, какой это поток. Консольный, файловый, входной- не знаю. Но суть его мне известна- зная суть можно определить название (я не могу) если надо. Суть: поток должен быть таким, чтобы из него загнать данные в объект типа Verylong Вот синтаксис загона:
0
|
![]() 1670 / 1042 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|||||||||||
02.01.2011, 18:35 | 9 | ||||||||||
А, собственно, зачем? Что мешает порождать Verylong сразу из list<char> (кстати, зачем именно list? Чем не угодил старый добрый vector?), без промежуточного "виртуального потока"? А если приспичило именно со стрелками, то почему бы сразу и не определить нечто вроде
0
|
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
|
||||||
02.01.2011, 18:58 [ТС] | 10 | |||||
А как без стрелок-то?
Без стрелок это значит (схематично): создать объект типа Verylong и параметром ему передать list Verylong Vl (L); НО дело в том, что нет конструктора Verylong (list<int>& L)! Всякие есть а такого нет А оператор "=" переопределён длякласса Verylong так: const Verylong& operator=(const Verylong&); Вот как мне список загнать с Verylong? Только загоняя список куда-то в буфер какой-то (в поток тот же самый), а потом оттуда в Verylong. Вот для того поток-посредник и нужен. А то, что Вы предлагаете, это, я так понял ЕЩЁ раз переопределить >> или << Ну вот я и спрашиваю- как без хирургического вмешательства это сделать, то есть имеющимися средствами? Просто класс Verylong не мой, выглядит солидно, лезть туда своими толстыми пальцами не хотелось бы. ...А именно список нужен по причине того, что я там делаю чтто-то типа ротации, вот так:
При всякой ротации происходит циклический сдвиг влево; Ну и кроме того, вектор для Вас старый добрый, для меня тут всё внове, а старый добрый для меня это int array [256];
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
02.01.2011, 19:19 | 11 | |||||
kravam, Хм.
Суть - пишем список в файл. В операторе - что-то делаем с данным потоком. Вот и все по идее оО
0
|
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
|
|
02.01.2011, 19:52 [ТС] | 12 |
То есть я понял так: Вы загнали вектор в текстовый файл, потом создали поток ifstream, с помощью которого направили поток из файла в объект типа One
То есть мне следует поступать по аналогии: перегнать список в текстовый файл, а потом оттуда потоком istream в объект типа Verylong. Правильно я вас понял?
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
02.01.2011, 20:01 | 13 |
kravam, Ну да. Там же переопределен оператор ввода из потока. Соответственно тупо посылаем туда файловый поток, в который записана информация из нужного списка.
0
|
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
|
||||||||||||||||
02.01.2011, 20:33 [ТС] | 14 | |||||||||||||||
Так, а потом file.txt ещё удалять надо
Ну да. Хм Вы меня натолкнули на мысль, я её опробовал и она получилась.
Вроде просто но мне хотелось бы обойтись конструкциями высокого уровня, то есть операторами >> А вот это вот поэлементое копирование
Ну, а создавать для такой цели текстовый файл тоже накладно. Не устраивает меня это. Вы уж извините. Впрочем, может по-другому просто нельзя, я это и хочу выяснить и тогда придётся лезть своими толстыми пальцами в чужой гениальный код класса VERYLONG и чё-нибудь там делать. Например, переопределять оператор "="
0
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
02.01.2011, 20:50 | 15 | |||||
kravam, Вообще если что - наследование неплохо бы подошло для этой затеи. Ну да как знаете.
А насчет без файла и т.п. - наверняка тоже можно. Просто записываем элементы в строковый поток - а затем читаем из него... сейчас попробую набросать. Добавлено через 13 минут
1
|
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
|
|
02.01.2011, 20:58 [ТС] | 16 |
Во-во, использовать строковый поток вместо файлового куда лучше. Не опробовал пока, но идея ясна. А вот ещё такой вопрос: вообще как программисты поступают, вот допустим, возникла необходимость поправить чужой класс VERYLONG. То есть понятно дело, я чё хочу с исходником то и делаю, но я просто не знаю всех подводных камней кроме того, естествено, что я там напортачу. Может, стандарты какие надо соблюдать или что ещё и вообще насколько технически грамотно решение- править чужой качественный класс, пусть даже и неполный?
0
|
![]() 1670 / 1042 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
|
|
02.01.2011, 21:04 | 17 |
Программист постарается не исправлять класс, а наиболее эффективно воспользоваться уже имеющимися в нём возможностями. Для более конкретного ответа неплохо бы увидеть интерфейс этого самого Verylong. Возможно, там имеются более удобные средства порождения, чем за счёт потока.
1
|
7 / 7 / 0
Регистрация: 25.12.2010
Сообщений: 41
|
|
02.01.2011, 21:07 | 18 |
1
|
В астрале
![]() 8041 / 4798 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
02.01.2011, 21:10 | 19 |
Или же делают производный класс в котором переопределяют все, что нужно.
1
|
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
|
|
02.01.2011, 21:10 [ТС] | 20 |
Скачал откуда-то, может, кто заинтересуется, класс "большие числа".
Косметические дополнения типа: приписать using namespace std;
0
|
02.01.2011, 21:10 | |
Помогаю со студенческими работами здесь
20
Переопределить оператор присваивания Переопределить оператор << в классе Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. Как создать правильно новый класс и переопределить его метод Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |