Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.58
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
#1

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

02.01.2011, 02:48. Просмотров 2493. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.01.2011, 02:48
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как создать виртуальный поток и переопределить оператор <<? (C++):

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

Как по нажатию на кнопку создать новый поток - C++ Builder
Мне нужно организовать выход из безконечного цикла. Пока не нажата кнопка №2 выполняется цикл, который запускается кнопкой №1. void...

Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток)) - C++ Builder
Помогите пожалуйсмта))))) Как в С++ Builder из 2х потоков рисовать на форме квадратики(это первый поток рисует) и кружочки (2ой поток))

Как переопределить метод родителя класса? - C++ Builder
Есть класс TDot, который есть классом-наследником для класса TTriangle В классе TDot есть метод setColor(), который меняет цвет и метод...

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

Как в VS 2008 создать поток? - Visual C++
Здравствуйте! IDE - Visual Studio 2008 C++ OS - Windows XP Я в С++ новичёк, вот разбираюсь с потоками. В общем &quot;концепция&quot;...

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

Не по теме:

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

0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
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
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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;
}
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
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
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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;
}
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
02.01.2011, 17:57  [ТС] #8
ForEveR,
Я понимаю, Новый Год и всё такое. С праздником, кстати.
Значит. На консоль я данные могу вывести. Даже из текстового файла. И даже условно (!) говоря из консоли в консоль как в предыдущем примере.

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

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

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

Суть: поток должен быть таким, чтобы из него загнать данные в объект типа Verylong
Вот синтаксис загона:
C++
1
istream & operator>> (istream &s, Verylong &v)
0
Nick Alte
Эксперт С++
1643 / 1015 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 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);
Короче, зачем нужен поток-посредник?
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
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
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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;
}
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
02.01.2011, 19:52  [ТС] #12
То есть я понял так: Вы загнали вектор в текстовый файл, потом создали поток ifstream, с помощью которого направили поток из файла в объект типа One

То есть мне следует поступать по аналогии: перегнать список в текстовый файл, а потом оттуда потоком istream в объект типа Verylong. Правильно я вас понял?
0
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
02.01.2011, 20:01 #13
kravam, Ну да. Там же переопределен оператор ввода из потока. Соответственно тупо посылаем туда файловый поток, в который записана информация из нужного списка.
0
kravam
быдлокодер
1704 / 891 / 45
Регистрация: 04.06.2008
Сообщений: 5,496
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
ForEveR
В астрале
Эксперт С++
7985 / 4744 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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;
}
1
02.01.2011, 20:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.01.2011, 20:50
Привет! Вот еще темы с ответами:

Как создать дополнительный поток? - Visual C++
сабж. пробовал создавать так: void Thread( void* pParams ) { int i, num = 0; while ( 1 ) { Sleep(1000); ...

Как создать поток (Thread) в с++ mfc? - Visual C++
Здравствуйте!) Не могу ни как понять, как создать поток в с++ mfc? В c# и с++ делал потоки, но в mfc как-то по другому они чтоль...

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

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


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

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

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