Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.88/16: Рейтинг темы: голосов - 16, средняя оценка - 4.88
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
1

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

02.01.2011, 02:48. Просмотров 3321. Ответов 21
Метки нет (Все метки)

Виртуальный то есть имеется ввиду не файловый и не строковый и не консольный.

Впрочем, создание сего не противоречит синтаксису. Вот, например, тут написано про поток
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 );
Но почему-то не получается. Помогите пожалуйста, друзья! Спасибо заранее.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.01.2011, 02:48
Ответы с готовыми решениями:

Создать класс Str (символьная строка). Переопределить оператор присвоения.
Помогите решить с обяснениями. Создать класс Str (символьная строка). Переопределить оператор...

Как переопределить оператор ++ типа char?
Добрий день Хочу спросить возможно ли как-то переопредилить оператор ++ типа char?

Как можно сделать виртуальный поток ввода / вывода?
есть программа, которая считает кол-во слов в строке причудливым способом, конечно можно сделать...

Переопределить поток вывода cout
Есть некоторый кусок кода выводящий на консоль информацию с помощью cout, все бы хорошо, но при...

21
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
02.01.2011, 12:49 2
kravam, У ostream нету конструктора без параметров.
Надо работать с указателем на класс производный от streambuf, разобраться с ним, и подать его в параметр потока.
0
rangerx
02.01.2011, 14:30
  #3

Не по теме:

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

0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
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)

Ну вот, пытался понятно изложить суть проблемы, хотя я сам запутался уже. Надеюсь тык скыть на помощь
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
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;
}
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
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
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
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;
}
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
02.01.2011, 17:57  [ТС] 8
ForEveR,
Я понимаю, Новый Год и всё такое. С праздником, кстати.
Значит. На консоль я данные могу вывести. Даже из текстового файла. И даже условно (!) говоря из консоли в консоль как в предыдущем примере.

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

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

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

Суть: поток должен быть таким, чтобы из него загнать данные в объект типа Verylong
Вот синтаксис загона:
C++
1
istream & operator>> (istream &s, Verylong &v)
0
Эксперт С++
1659 / 1031 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
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);
Короче, зачем нужен поток-посредник?
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
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];
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
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;
}
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
02.01.2011, 19:52  [ТС] 12
То есть я понял так: Вы загнали вектор в текстовый файл, потом создали поток ifstream, с помощью которого направили поток из файла в объект типа One

То есть мне следует поступать по аналогии: перегнать список в текстовый файл, а потом оттуда потоком istream в объект типа Verylong. Правильно я вас понял?
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
02.01.2011, 20:01 13
kravam, Ну да. Там же переопределен оператор ввода из потока. Соответственно тупо посылаем туда файловый поток, в который записана информация из нужного списка.
0
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
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 и чё-нибудь там делать. Например, переопределять оператор "="
0
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
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;
}
1
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
02.01.2011, 20:58  [ТС] 16
Во-во, использовать строковый поток вместо файлового куда лучше. Не опробовал пока, но идея ясна. А вот ещё такой вопрос: вообще как программисты поступают, вот допустим, возникла необходимость поправить чужой класс VERYLONG. То есть понятно дело, я чё хочу с исходником то и делаю, но я просто не знаю всех подводных камней кроме того, естествено, что я там напортачу. Может, стандарты какие надо соблюдать или что ещё и вообще насколько технически грамотно решение- править чужой качественный класс, пусть даже и неполный?
0
Эксперт С++
1659 / 1031 / 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
Цитата Сообщение от kravam Посмотреть сообщение
А вот ещё такой вопрос: вообще как программисты поступают, вот допустим, возникла необходимость поправить чужой класс VERYLONG.
Пишут friend для этого класса или глобальную функцию
1
В астрале
Эксперт С++
8023 / 4780 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
02.01.2011, 21:10 19
Или же делают производный класс в котором переопределяют все, что нужно.
1
быдлокодер
1718 / 905 / 106
Регистрация: 04.06.2008
Сообщений: 5,612
02.01.2011, 21:10  [ТС] 20
Скачал откуда-то, может, кто заинтересуется, класс "большие числа".
Косметические дополнения типа: приписать using namespace std;
0
Вложения
Тип файла: zip verylong.zip (3.5 Кб, 13 просмотров)
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.01.2011, 21:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Переопределить оператор присваивания
Немогу переопределить оператор присваивания для своего типа - линейного списка. Проблема в том, что...

Переопределить оператор << в классе
Добрый день. Не пойму как переопределить оператор &lt;&lt; для моего класса Пробую так #include...

Нужно создать базу данных (создать пустой бинарный файл). Через поток. Поток бинарного файла описать в виде локальной переменной внутри функции.
Совсем не понял эту тему. Нужно создать базу данных (создать пустой бинарный файл). Через поток....

Как создать правильно новый класс и переопределить его метод
Необходимо создать новый класс родителем которого будет textBox в котором будет прикручено: ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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