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

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

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

ostream C++
C++ friend ostream &operator<<(ostream &stream, MyClass o);
Класс ostream C++
C++ istream, ostream
ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 22:20     Наследование ostream #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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:23     Наследование ostream #22
Цитата Сообщение от Ksan Посмотреть сообщение
Добавлено через 2 минуты
Кстати, что означает эта запись?
Не по теме:
Я гуглил...
Код C++
1 Rostream(filebuf fb) : ostream(&fb)
{ }
Конструктор производного класса. После двоеточия идёт список инициализаторов (знакомое или нет?) . До входа в тело конструктора, должен былть создан объект базового класса (в данном случае, объект ostream). Так как в ostream констуктора по умолчанию нет, он должен быть задан явно. Аргументы, для инициализации объекта ostream, передаются в него через параметры конструктора Rostream ( в данном случае, указатель на filebuf).
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:23  [ТС]     Наследование ostream #23
Цитата Сообщение от soon Посмотреть сообщение
: std::ostream(s)
Что значит двоеточие? Я уже гуглил и не раз. Как это переделать без него?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 22:24     Наследование ostream #24
Ksan, список инициализации. Никак. Точка.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:26  [ТС]     Наследование ostream #25
alsav22, Оу, спасибо. Наконец-то объяснили по-нормальному)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:28     Наследование ostream #26
Цитата Сообщение от soon Посмотреть сообщение
Пардон, ЩИТО?
В вашем коде разве оператор << перегружен, как у него?
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:33  [ТС]     Наследование ostream #27
soon, между прочим, не робит
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:57     Наследование ostream #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;
    }
};
. Для данного примера, всё равно. При наследовании, создание объекта базового класса, только через список инициализаторов, потому что необходимо, чтобы объкт базового класса создавался до создания объекта производного класса.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:10     Наследование ostream #29
Цитата Сообщение от Ksan Посмотреть сообщение
soon, между прочим, не робит
Робит
http://liveworkspace.org/code/a99c4c...d1a89846c89952

Цитата Сообщение от 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;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 23:12     Наследование ostream #30
Цитата Сообщение от soon Посмотреть сообщение
ТС хочет отлавливать вывод const char*?
Он хочет и const char и int. У него, если я правильно понял, идея в том, чтобы вывод русских букв сделать через объекты своего класса.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:13     Наследование ostream #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;
}
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:25     Наследование ostream #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]
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 23:26     Наследование ostream #33
Цитата Сообщение от soon Посмотреть сообщение
friend Foo& operator<<(Foo& f, const char*) override
override подчёркивает. Требует точку с запятой.
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:28     Наследование ostream #34
Цитата Сообщение от alsav22 Посмотреть сообщение
override подчёркивает. Требует точку с запятой.
Удалите, он там ни к чему. От прошлых экспериметов остался.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 23:32     Наследование ostream #35
soon, прошу прощения, ваш код работал. Это у ТС int не выводит без перегрузки << для int.
Цитата Сообщение от soon Посмотреть сообщение
Так в чем проблема перегрузить внешней функцией?
У меня, в данном вопросе, проблем нет. Проблемы у ТС. Если можно, то как сделать.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 23:40  [ТС]     Наследование ostream #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)
            {
                        
            }
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2012, 23:42     Наследование ostream
Еще ссылки по теме:

Ofstream and ostream C++
Наследование от std::ostream C++
Friend ostream& operator<<(ostream& stream, CArr& obj); C++

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

Или воспользуйтесь поиском по форуму:
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:42     Наследование ostream #37
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня, в данном вопросе, проблем нет. Проблемы у ТС. Если можно, то как сделать.
Через frined, я уже показал. Но, разумеется, выводить не в std::cout, а в приватную переменную(поток), который задается при инициализации. Но это путь уж ТС сам.

Добавлено через 2 минуты
Цитата Сообщение от Ksan Посмотреть сообщение
а этим мы делаем из объекта новый cout?
Этим мы конструируем родительский класс ostream с параметром, передаваемым в конструтор. В моем случае параметр берется из cout, но фактически это может быть любой ostream объект.
Yandex
Объявления
10.07.2012, 23:42     Наследование ostream
Ответ Создать тему
Опции темы

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