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

Как создать виртуальный поток и переопределить оператор <<? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.58
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,297
02.01.2011, 02:48     Как создать виртуальный поток и переопределить оператор <<? #1
Виртуальный то есть имеется ввиду не файловый и не строковый и не консольный.

Впрочем, создание сего не противоречит синтаксису. Вот, например, тут написано про поток
ostream и про оператор <<

Так а теперь мой код:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
using namespace std;
 
int main (){
 int k= 87;;
 ostream o();
 o<< k;
 return 0;
}
Коспилятор пишет: неизвестные типы операндов... И так далее.
Как неизвестные? Всё известно.
Вот, идём по сссылке и видим один из вариантов (мой)
C++
1
ostream& operator<< (int& val );
Но почему-то не получается. Помогите пожалуйста, друзья! Спасибо заранее.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2011, 02:48     Как создать виртуальный поток и переопределить оператор <<?
Посмотрите здесь:

Visual C++ Как создать дополнительный поток?
C++ Переопределить поток вывода cout
Visual C++ Переопределить оператор присваивания
C++ Создать класс Str (символьная строка). Переопределить оператор присвоения.
C++ Переопределить оператор << в классе
C++ WinAPI Как создать поток?
C++ виртуальный оператор (двусвязный список, наследование)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.01.2011, 12:49     Как создать виртуальный поток и переопределить оператор <<? #2
kravam, У ostream нету конструктора без параметров.
Надо работать с указателем на класс производный от streambuf, разобраться с ним, и подать его в параметр потока.
rangerx
02.01.2011, 14:30
  #3

Не по теме:

C++
1
ostream o();
это прототип функции, а не создание объекта.

kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,297
02.01.2011, 15:37  [ТС]     Как создать виртуальный поток и переопределить оператор <<? #4
Короче, мне непонятна общая концепция тык скыть. Чё надо делать.

Вот у меня имеется список list<char>, он корректен.

И вот у меня имеется класс "большие числа". И вот мне этот список надо в это большое число загнать.
Дабы не писать ЛИШНЕГО, пробую обойтись имеющимися средствами.
Вот у класса "большие числа" есть такой оператор перенаправления:
C++
1
istream & operator>> (istream &s, Verylong &v)
ия хочу его использовать. То есть мне надо как-то список загнать в поток, а поток в большое число, схематично если:

список---> поток---> большое число

(ну или двусточная операция пусть будет, щас это невжно)

Так, вот первая задача

1) пробую загнать список в поток. Для list такого оператора нет! Вот тут мне непонятно чё делать
2) я умею вывести list на консоль вот так, и думаю, может этот способ как-то использовать?
C++
1
2
3
4
void out(const list<char> &L) {
 copy(L.begin(), L.end(), ostream_iterator<char>(cout, " ")); 
 cout << endl; 
}
Если вместо консоли написать СВОЙ поток, перенаправить туда list, а потом из своего потока направить в большое число
3) НО тут встаёт ещё одна задача. Если я сделаю так, то list направится в поток который имеет тип ofstream
Но из потока типа ofsream мне в большое число ничё не направить, ибо там должен быть тип iofstream! Напомню:
istream & operator>> (istream &s, Verylong &v)

Ну вот, пытался понятно изложить суть проблемы, хотя я сам запутался уже. Надеюсь тык скыть на помощь
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.01.2011, 16:50     Как создать виртуальный поток и переопределить оператор <<? #5
kravam, 1) Не совсем понятно. Что значит "загнать список в поток"? В поток ввода или в поток вывода? Как вариант сделать класс производный от std::list. И для него перегрузить оператор ввода/вывода. Ну а можно просто через copy - ибо copy через istream_iterator к примеру может и вводить последовательность, а не только выводить.
2) ...
3) ifstream класс производный от istream.

Добавлено через 6 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
 
void print(std::istream& is)
{
    std::vector<int> Vec;
    while(!is.eof())
    {
        if(!is.eof())
        {
            int t=0;
            is>>t;
            Vec.push_back(t);
        }
    }
    std::copy(Vec.begin(), Vec.end(), std::ostream_iterator<int>(std::cout, " "));
}
 
int main()
{
    std::ifstream ifs("file.txt");
    if(!ifs)
    {
        std::cerr<<"Error\n";
        return 1;
    }
    print(ifs);
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,297
02.01.2011, 17:34  [ТС]     Как создать виртуальный поток и переопределить оператор <<? #6
мне нужно загнать лист в поток, который мне всё равно как называется (наверное, двунаправленный)из которого я мог бы перегнать содержание в класс "большие числа", вот оператор ">>" для больших чисел:
C++
1
istream & operator>> (istream &s, Verylong &v)
Писать свой класс можно но это на крайний случай, надо сперва исследовать имеющиеся инструменты.

Вот насчёт copy, я всё думал и до сих пор думаю, как мне с её помощью скопировать список в нужный поток (определение потока см. выше). Вот copy копирует лист в консольный поток:
C++
1
2
3
4
void out(const list<char> &L) {
 copy(L.begin(), L.end(), ostream_iterator<char>(cout, " ")); 
 cout << endl; 
}
Как минимум надо использовать istream_iterator вместо ostream_iterator, Вы так предложили. Но возможно ли это? Но мне кажется, нельзя, ибо посмотрел синтаксис copy , там третьим праметром принимается итератор
OutputIterator

А не InputIterator
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.01.2011, 17:42     Как создать виртуальный поток и переопределить оператор <<? #7
kravam, Эм.

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
 
int main()
{
    std::vector<int> Vec;
    std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(Vec));
    std::copy(Vec.begin(), Vec.end(), std::ostream_iterator<int>(std::cout, " "));
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,297
02.01.2011, 17:57  [ТС]     Как создать виртуальный поток и переопределить оператор <<? #8
ForEveR,
Я понимаю, Новый Год и всё такое. С праздником, кстати.
Значит. На консоль я данные могу вывести. Даже из текстового файла. И даже условно (!) говоря из консоли в консоль как в предыдущем примере.

Но мне на консоль НЕ НАДО.
Задача чуть-чуть сложнее. Если не решается по какой-то причине- ну ладно.

Задача вывести (или ввести, но дело не в названии ведь) данные из списка в поток.
Я так понимаю, мне нужно ответить на вопрос- какой поток?

Я не знаю, какой это поток. Консольный, файловый, входной- не знаю. Но суть его мне известна- зная суть можно определить название (я не могу) если надо.

Суть: поток должен быть таким, чтобы из него загнать данные в объект типа Verylong
Вот синтаксис загона:
C++
1
istream & operator>> (istream &s, Verylong &v)
Nick Alte
Эксперт С++
1593 / 985 / 117
Регистрация: 27.09.2009
Сообщений: 1,901
Завершенные тесты: 1
02.01.2011, 18:35     Как создать виртуальный поток и переопределить оператор <<? #9
А, собственно, зачем? Что мешает порождать Verylong сразу из list<char> (кстати, зачем именно list? Чем не угодил старый добрый vector?), без промежуточного "виртуального потока"? А если приспичило именно со стрелками, то почему бы сразу и не определить нечто вроде
C++
1
Verylong& Verylong::operator << (const std::list<char>& source);
или
C++
1
const std::list<char>& operator >> (const std::list<char>& source, Verylong& destination);
Короче, зачем нужен поток-посредник?
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,297
02.01.2011, 18:58  [ТС]     Как создать виртуальный поток и переопределить оператор <<? #10
А как без стрелок-то?
Без стрелок это значит (схематично): создать объект типа Verylong и параметром ему передать list
Verylong Vl (L);

НО дело в том, что нет конструктора Verylong (list<int>& L)! Всякие есть а такого нет
А оператор "=" переопределён длякласса Verylong так:
const Verylong& operator=(const Verylong&);

Вот как мне список загнать с Verylong? Только загоняя список куда-то в буфер какой-то (в поток тот же самый), а потом оттуда в Verylong. Вот для того поток-посредник и нужен.
А то, что Вы предлагаете, это, я так понял ЕЩЁ раз переопределить >> или <<

Ну вот я и спрашиваю- как без хирургического вмешательства это сделать, то есть имеющимися средствами? Просто класс Verylong не мой, выглядит солидно, лезть туда своими толстыми пальцами не хотелось бы.

...А именно список нужен по причине того, что я там делаю чтто-то типа ротации, вот так:
C++
1
2
3
4
5
6
7
 [FONT=monospace]for (int i= 0; i< spisok.size(); i++) {
  
  //тут вывод на консоль
  out (spisok);
  spisok.splice(spisok.end(), spisok, spisok.begin()) ; 
 }          
[/FONT]



При всякой ротации происходит циклический сдвиг влево;
Ну и кроме того, вектор для Вас старый добрый, для меня тут всё внове, а старый добрый для меня это int array [256];
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.01.2011, 19:19     Как создать виртуальный поток и переопределить оператор <<? #11
kravam, Хм.
Суть - пишем список в файл. В операторе - что-то делаем с данным потоком. Вот и все по идее оО
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <fstream>
#include <vector>
 
class One
{
public:
   One()
   {
   }
   int& operator [](size_t idx)
   {
       return Lst[idx];
   }
   
   const int& operator [](size_t idx) const
   {
       return Lst[idx];
   }
 
   void push(int var) 
   {
       Lst.push_back(var);
   }
private:
   std::vector<int> Lst;
};
 
std::istream& operator >>(std::istream& is, One& first)
{
    while(!is.eof())
    {
         int t=0;
         is>>t;
         first.push(t);
    }
    return is;
}
 
int main()
{
    const int n=10;
    std::vector<int> Lst;
    for(int i=0; i<n; ++i)
       Lst.push_back(i+1);
    std::ofstream ofs("file.txt");
    for(int i=0; i<n; ++i)
       ofs<<Lst[i]<<' ';
    ofs.close();
    std::ifstream ifs("file.txt");
    One one;
    ifs>>one;
    for(int i=0; i<n; ++i)
       std::cout<<one[i]<<'\n';
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,297
02.01.2011, 19:52  [ТС]     Как создать виртуальный поток и переопределить оператор <<? #12
То есть я понял так: Вы загнали вектор в текстовый файл, потом создали поток ifstream, с помощью которого направили поток из файла в объект типа One

То есть мне следует поступать по аналогии: перегнать список в текстовый файл, а потом оттуда потоком istream в объект типа Verylong. Правильно я вас понял?
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.01.2011, 20:01     Как создать виртуальный поток и переопределить оператор <<? #13
kravam, Ну да. Там же переопределен оператор ввода из потока. Соответственно тупо посылаем туда файловый поток, в который записана информация из нужного списка.
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,297
02.01.2011, 20:33  [ТС]     Как создать виртуальный поток и переопределить оператор <<? #14
Так, а потом file.txt ещё удалять надо
Ну да. Хм Вы меня натолкнули на мысль, я её опробовал и она получилась.

C++
1
2
3
4
5
6
7
8
9
10
 //имеем список элементов типа char
 list<char>::iterator it;
 it= spisok.begin();
 
 for (it= spisok.begin(); it!=spisok.end(); it++)  {
  str+=*it;
 }
 Verylong h (str.c_str());
 
 cout<< h<< endl;;
всё.

Вроде просто но мне хотелось бы обойтись конструкциями высокого уровня, то есть операторами >>
А вот это вот поэлементое копирование
C++
1
  str+=*it;
это всё отход назад, я так не хочу больше. И вот это вот:
C++
1
Verylong h (str.c_str());
Это то есть будет у меня 10 списков, я 10 раз должен объявлять объект типа Verylong. Тоже коряво.
Ну, а создавать для такой цели текстовый файл тоже накладно. Не устраивает меня это. Вы уж извините.

Впрочем, может по-другому просто нельзя, я это и хочу выяснить и тогда придётся лезть своими толстыми пальцами в чужой гениальный код класса VERYLONG и чё-нибудь там делать. Например, переопределять оператор "="
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.01.2011, 20:50     Как создать виртуальный поток и переопределить оператор <<? #15
kravam, Вообще если что - наследование неплохо бы подошло для этой затеи. Ну да как знаете.
А насчет без файла и т.п. - наверняка тоже можно. Просто записываем элементы в строковый поток - а затем читаем из него... сейчас попробую набросать.

Добавлено через 13 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <iostream>
#include <vector>
#include <sstream>
#include <algorithm>
 
class One
{
public:
   One()
   {
   }
   int& operator [](size_t idx)
   {
       return Lst[idx];
   }
   
   const int& operator [](size_t idx) const
   {
       return Lst[idx];
   }
 
   void push(int var) 
   {
       Lst.push_back(var);
   }
 
   std::vector<int>& getelem() 
   {
       return Lst;
   }
private:
   std::vector<int> Lst;
};
 
std::istream& operator >>(std::istream& is, One& first)
{
    std::copy(std::istream_iterator<int>(is), std::istream_iterator<int>(), std::back_inserter(first.getelem()));
    return is;
}
 
std::ostream& operator <<(std::ostream& os, One& first)
{
    std::copy(first.getelem().begin(), first.getelem().end(), std::ostream_iterator<int>(std::cout, "\n"));
    return os;
}
 
int main()
{
    const int n=10;
    std::vector<int> Lst;
    std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(Lst));
    std::stringstream ss;
    std::copy(Lst.begin(), Lst.end(), std::ostream_iterator<int>(ss, " "));
    One Ob;
    ss>>Ob;
    std::cout<<Ob;
    return 0;
}
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,297
02.01.2011, 20:58  [ТС]     Как создать виртуальный поток и переопределить оператор <<? #16
Во-во, использовать строковый поток вместо файлового куда лучше. Не опробовал пока, но идея ясна. А вот ещё такой вопрос: вообще как программисты поступают, вот допустим, возникла необходимость поправить чужой класс VERYLONG. То есть понятно дело, я чё хочу с исходником то и делаю, но я просто не знаю всех подводных камней кроме того, естествено, что я там напортачу. Может, стандарты какие надо соблюдать или что ещё и вообще насколько технически грамотно решение- править чужой качественный класс, пусть даже и неполный?
Nick Alte
Эксперт С++
1593 / 985 / 117
Регистрация: 27.09.2009
Сообщений: 1,901
Завершенные тесты: 1
02.01.2011, 21:04     Как создать виртуальный поток и переопределить оператор <<? #17
Программист постарается не исправлять класс, а наиболее эффективно воспользоваться уже имеющимися в нём возможностями. Для более конкретного ответа неплохо бы увидеть интерфейс этого самого Verylong. Возможно, там имеются более удобные средства порождения, чем за счёт потока.
XomyaC++
7 / 7 / 1
Регистрация: 25.12.2010
Сообщений: 41
02.01.2011, 21:07     Как создать виртуальный поток и переопределить оператор <<? #18
Цитата Сообщение от kravam Посмотреть сообщение
А вот ещё такой вопрос: вообще как программисты поступают, вот допустим, возникла необходимость поправить чужой класс VERYLONG.
Пишут friend для этого класса или глобальную функцию
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7933 / 4715 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
02.01.2011, 21:10     Как создать виртуальный поток и переопределить оператор <<? #19
Или же делают производный класс в котором переопределяют все, что нужно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2011, 21:10     Как создать виртуальный поток и переопределить оператор <<?
Еще ссылки по теме:

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции. C++
Как можно сделать виртуальный поток ввода / вывода? C++
C++ Как переопределить оператор ++ типа char?
Подскажите, нужно перегрузить оператор или создать метод(если создать то не понимаю как) записи в файл C++
Как перегрузить оператор вывода в поток для вектора? C++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,297
02.01.2011, 21:10  [ТС]     Как создать виртуальный поток и переопределить оператор <<? #20
Скачал откуда-то, может, кто заинтересуется, класс "большие числа".
Косметические дополнения типа: приписать using namespace std;
Вложения
Тип файла: zip verylong.zip (3.5 Кб, 11 просмотров)
Yandex
Объявления
02.01.2011, 21:10     Как создать виртуальный поток и переопределить оператор <<?
Ответ Создать тему
Опции темы

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