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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
#1

Наследование ostream - C++

10.07.2012, 16:59. Просмотров 2041. Ответов 36
Метки нет (Все метки)

Я наследовал от ostream класс, перегрузил operator<<(const char *)
для одного типа данных, и создал объект newcout, однако он почему-то не может выводить int. Почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2012, 16:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Наследование ostream (C++):

Наследование от std::ostream - C++
Имеем код: #include &lt;iostream&gt; class DebugMessage : public std::ostream { public: DebugMessage() : std::ostream(...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? - C++
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

friend ostream &operator<<(ostream &stream, MyClass o); - C++
Что означает данная строчка которую обычно пишут в конце класса? friend ostream &amp;operator&lt;&lt;(ostream &amp;stream, MyClass o);

Friend ostream& operator<<(ostream& stream, CArr& obj); - C++
CArr.h #pragma once class CArr{ int* arr = nullptr; int size = 10; void swap(int *a, int *b); void swap(int &amp;a, int &amp;b); ...

ostream - C++
Вот мой класс: class BigInt { int Size; // Size - текущая длина (истинная длинна числа) int SizeMax; //...

istream, ostream - C++
Есть задача по сохранению в файл и восстановлении из файла объекта. Функции надо сделать такие: void Serialize(std::ostream &amp; stream); //...

36
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:00 #16
Вот этот код работает в том смысле, что объект класса Rostream выводит на консоль с помощью << строки и int.
код
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
#include <iostream>
#include <fstream>
#include <Windows.h>
using namespace std;
 
class Rostream : public ostream
{
        filebuf fb;
        
        public:
        Rostream(filebuf fb) : ostream(&fb)
        {
        
        }
                
        Rostream& operator<<(const char *chbuff)
        {
              char chbuff2[2] = "q";
              string alphabet = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
                        
              for(int i=0; i<strlen(chbuff); ++i)
              {
                  if(alphabet.find(chbuff[i]) < 0)
                  {
                      // если не русский язык, то просто вывести
                      cout << chbuff[i];
                      continue;
                  }
                  chbuff2[0] = chbuff[i];
                  CharToOem(chbuff2, chbuff2);
                  cout << chbuff2;
               }
               return *this;
         }
 
         Rostream& operator<<(const int val)
         {
              cout << val;
              return *this;
         }
 
};
 
int main()
{
  filebuf fb;
  Rostream newcout(fb);
  
  newcout << 12;
  newcout << "ФФФФФФФФФ";
  
  system("pause");
  return 0;
}


Добавлено через 7 минут
Цитата Сообщение от Ksan Посмотреть сообщение
alsav22, русский язык выводит корректно
Идею понял. Этот код русские буквы выводит нормально. Достаточно #include <Windows.h> и #include <fstream> (это для конструктора базового класса). Чтобы другие типы данных выводились объектами Rostream, нужно и для них перегрузить << , так же как для int.
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:03  [ТС] #17
alsav22, объясни что ты сделал и что такое filebuf?
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:10 #18
Для конструктора объекта ostream нужен объект streambuf http://www.cplusplus.com/reference/iostream/ostream/ostream/ Единственное, что я нашёл подходящего, это filebuf (буфер для файлового ввода- вывода). Наверное, можно как-то и по другому сделать. Тут у меня знаний не хватает.
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:14  [ТС] #19
alsav22, я пытался сделать через

C++
1
2
ostream *rcout  = new Rostream;
(*rcout) << 10;
но так почему-то не работает

Добавлено через 2 минуты
Кстати, что означает эта запись?

Не по теме:

Я гуглил...



C++
1
Rostream(filebuf fb) : ostream(&fb)
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:14 #20
Цитата Сообщение от Ksan Посмотреть сообщение
alsav22, объясни что ты сделал и что такое filebuf?
Ничего особенного не делал. Нужно было выяснить, как создать объект ostream, чтобы использовать это в конструкторе Rostream.
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 22:20 #21
Цитата Сообщение от alsav22 Посмотреть сообщение
Там есть, но вы же хотите, чтобы объёкт вашего класса выводил int с помощью <<. Значит << надо перегрузить и для int.
Пардон, ЩИТО?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct Foo: public std::ostream
{
    Foo(std::basic_streambuf<char, std::char_traits<char>>* s)
        : std::ostream(s)
    {
 
    }
};
 
int main()
{
    Foo f(std::cout.rdbuf());
    f << "What?!" << std::endl;
    f << 42 << std::endl;
    return 0;
}
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:23 #22
Цитата Сообщение от Ksan Посмотреть сообщение
Добавлено через 2 минуты
Кстати, что означает эта запись?
Не по теме:
Я гуглил...
Код C++
1 Rostream(filebuf fb) : ostream(&fb)
{ }
Конструктор производного класса. После двоеточия идёт список инициализаторов (знакомое или нет?) . До входа в тело конструктора, должен былть создан объект базового класса (в данном случае, объект ostream). Так как в ostream констуктора по умолчанию нет, он должен быть задан явно. Аргументы, для инициализации объекта ostream, передаются в него через параметры конструктора Rostream ( в данном случае, указатель на filebuf).
1
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:23  [ТС] #23
Цитата Сообщение от soon Посмотреть сообщение
: std::ostream(s)
Что значит двоеточие? Я уже гуглил и не раз. Как это переделать без него?
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 22:24 #24
Ksan, список инициализации. Никак. Точка.
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:26  [ТС] #25
alsav22, Оу, спасибо. Наконец-то объяснили по-нормальному)
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:28 #26
Цитата Сообщение от soon Посмотреть сообщение
Пардон, ЩИТО?
В вашем коде разве оператор << перегружен, как у него?
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:33  [ТС] #27
soon, между прочим, не робит
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:57 #28
soon, вот код по вашему предложению. Если не перегрузить << для int, то не работает.
код
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
#include <iostream>
#include <Windows.h>
using namespace std;
 
class Rostream : public ostream
{
        
        public:
        Rostream(basic_streambuf<char, char_traits<char>>* s) : ostream(s)
        {
        
        }
                
        Rostream& operator<<(const char *chbuff)
        {
              char chbuff2[2] = "q";
              string alphabet = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
                        
              for(int i=0; i<strlen(chbuff); ++i)
              {
                  if(alphabet.find(chbuff[i]) < 0)
                  {
                      // если не русский язык, то просто вывести
                      cout << chbuff[i];
                      continue;
                  }
                  chbuff2[0] = chbuff[i];
                  CharToOem(chbuff2, chbuff2);
                  cout << chbuff2;
               }
               return *this;
         }
 
         //Rostream& operator<<(const int val)
         //{
              //cout << val;
              //return *this;
         //}
 
};
 
int main()
{
  
  Rostream newcout(cout.rdbuf());
  newcout << 12;
  newcout << "ФФФФФФФФФФФФФФ";
  
  system("pause");
  return 0;
}


Добавлено через 4 минуты
Ksan, soon подсказал как лучше буфер сделать для конструктора.

Добавлено через 14 минут
Цитата Сообщение от Ksan Посмотреть сообщение
Что значит двоеточие? Я уже гуглил и не раз. Как это переделать без него?
В данном случае, без него никак. Цитирую сам себя:"...До входа в тело конструктора, должен былть создан объект базового класса..." Для этого и используется список инициализаторов (можно только в конструкторах). Например, можно так:
C++
1
2
3
4
5
6
7
8
class A 
  {
    int x;
    int y;
    
    A(int a, int b) : x(a), y(b)
    { }
  };
, или так
C++
1
2
3
4
5
6
7
8
9
10
class A 
{
    int x;
    int y;
    
    A(int a, int b) : x(a)
    { 
      y = b;
    }
};
, а можно так:
C++
1
2
3
4
5
6
7
8
9
10
class A 
{
    int x;
    int y;
    
    A(int a, int b)
    { x = a;
      y = b;
    }
};
. Для данного примера, всё равно. При наследовании, создание объекта базового класса, только через список инициализаторов, потому что необходимо, чтобы объкт базового класса создавался до создания объекта производного класса.
0
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:10 #29
Цитата Сообщение от Ksan Посмотреть сообщение
soon, между прочим, не робит
Робит
http://liveworkspace.org/code/a99c4c407c694ddb19d1a89846c89952

Цитата Сообщение от alsav22 Посмотреть сообщение
В вашем коде разве оператор << перегружен, как у него?
ТС хочет отлавливать вывод const char*?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
struct Foo: public std::ostream
{
    Foo(std::basic_streambuf<char>* s): std::ostream(s)
    {
 
    }
 
    friend Foo& operator<<(Foo& f, const char*) override
    {
        std::cout << "Hello! I'm friend operator<< for const char*";
        return f;
    }
};
 
int main()
{
    Foo f(std::cout.rdbuf());
    f << "What?!" << std::endl;
    return 0;
}
0
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 23:12 #30
Цитата Сообщение от soon Посмотреть сообщение
ТС хочет отлавливать вывод const char*?
Он хочет и const char и int. У него, если я правильно понял, идея в том, чтобы вывод русских букв сделать через объекты своего класса.
0
10.07.2012, 23:12
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2012, 23:12
Привет! Вот еще темы с ответами:

Шаблонный ostream - C++
Здравствуйте. Не линкуется программа - не пойму в чем дело. &quot;Header.h&quot; #include &lt;iostream&gt; using namespace std; template...

Ofstream and ostream - C++
Как мне определить одну переменную для обоих потоков ? т .ею есть ффункция void Show(??? &amp;out) { out &lt;&lt; &quot; ...

Состояние ostream - C++
Допустим я определил функцию: friend std::ostream&amp; operator&lt;&lt; (std::ostream&amp; ost, Anything ...) { // тут я использую...

Класс ostream - C++
Как можно создать класс ostream? Такое ощущение, что кроме cout ничего из этого класса создать невозможно.


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

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

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