27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
1

Наследование ostream

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

Author24 — интернет-сервис помощи студентам
Я наследовал от ostream класс, перегрузил operator<<(const char *)
для одного типа данных, и создал объект newcout, однако он почему-то не может выводить int. Почему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2012, 16:59
Ответы с готовыми решениями:

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

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

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

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

36
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 22:20 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от 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
5498 / 4893 / 831
Регистрация: 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
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:23  [ТС] 23
Цитата Сообщение от soon Посмотреть сообщение
: std::ostream(s)
Что значит двоеточие? Я уже гуглил и не раз. Как это переделать без него?
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 22:24 24
Ksan, список инициализации. Никак. Точка.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:26  [ТС] 25
alsav22, Оу, спасибо. Наконец-то объяснили по-нормальному)
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:28 26
Цитата Сообщение от soon Посмотреть сообщение
Пардон, ЩИТО?
В вашем коде разве оператор << перегружен, как у него?
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:33  [ТС] 27
soon, между прочим, не робит
0
5498 / 4893 / 831
Регистрация: 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
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:10 29
Цитата Сообщение от Ksan Посмотреть сообщение
soon, между прочим, не робит
Робит
http://liveworkspace.org/code/... 9846c89952

Цитата Сообщение от 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
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 23:12 30
Цитата Сообщение от soon Посмотреть сообщение
ТС хочет отлавливать вывод const char*?
Он хочет и const char и int. У него, если я правильно понял, идея в том, чтобы вывод русских букв сделать через объекты своего класса.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:13 31
Цитата Сообщение от alsav22 Посмотреть сообщение
Он хочет и const char и 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
#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;
    f << 42 << std::endl;
    return 0;
}
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:25 32
Цитата Сообщение от alsav22 Посмотреть сообщение
Робит потому что оператор << в классе не перегружен, как у ТС.
Так в чем проблема перегрузить внешней функцией?

Добавлено через 7 минут
Цитата Сообщение от alsav22 Посмотреть сообщение
Чудеса! Первый код не работал.
Хм...
Bash
1
2
3
g++ -c -Wall -D_GLIBCXX_USE_NANOSLEEP -O3 --std=gnu++11 main.cpp -o main.o
g++ main.o -lm -lboost_regex -lboost_filesystem -lboost_system -lboost_timer -lboost_date_time -lboost_thread -o main
[Finished in 0.9s]
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 23:26 33
Цитата Сообщение от soon Посмотреть сообщение
friend Foo& operator<<(Foo& f, const char*) override
override подчёркивает. Требует точку с запятой.
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:28 34
Цитата Сообщение от alsav22 Посмотреть сообщение
override подчёркивает. Требует точку с запятой.
Удалите, он там ни к чему. От прошлых экспериметов остался.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 23:32 35
soon, прошу прощения, ваш код работал. Это у ТС int не выводит без перегрузки << для int.
Цитата Сообщение от soon Посмотреть сообщение
Так в чем проблема перегрузить внешней функцией?
У меня, в данном вопросе, проблем нет. Проблемы у ТС. Если можно, то как сделать.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 23:40  [ТС] 36
C++
1
2
3
4
5
6
friend Rostream& operator<<(Rostream &rostream, const char *chbuff)
                {
                        ...
                        
                        return rostream;
                }
Так сработало. Не знал, что можно "внешне" перегружать.

Добавлено через 51 секунду
а этим мы делаем из объекта новый cout?

C++
1
2
3
4
5
Rostream(std::basic_streambuf<char, std::char_traits<char> >* s)
        : std::ostream(s)
            {
                        
            }
0
2554 / 1319 / 178
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:42 37
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня, в данном вопросе, проблем нет. Проблемы у ТС. Если можно, то как сделать.
Через frined, я уже показал. Но, разумеется, выводить не в std::cout, а в приватную переменную(поток), который задается при инициализации. Но это путь уж ТС сам.

Добавлено через 2 минуты
Цитата Сообщение от Ksan Посмотреть сообщение
а этим мы делаем из объекта новый cout?
Этим мы конструируем родительский класс ostream с параметром, передаваемым в конструтор. В моем случае параметр берется из cout, но фактически это может быть любой ostream объект.
0
10.07.2012, 23:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2012, 23:42
Помогаю со студенческими работами здесь

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

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

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

Ostream istream
Народ объясните пожалуйста на пальцах что это и для чего это нужно friend ostream&amp; operator&lt;&lt;...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru