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

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

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

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

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

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

вопрос по ostream::write(). C++
ostream C++
странный ostream в 2010 C++
C++ friend ostream &operator<<(ostream &stream, MyClass o);
Класс ostream C++
C++ istream, ostream
C++ ostream& output
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
soon
2537 / 1302 / 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
5415 / 4811 / 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
2537 / 1302 / 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
5415 / 4811 / 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
5415 / 4811 / 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
2537 / 1302 / 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
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 23:12     Наследование ostream #30
Цитата Сообщение от soon Посмотреть сообщение
ТС хочет отлавливать вывод const char*?
Он хочет и const char и int. У него, если я правильно понял, идея в том, чтобы вывод русских букв сделать через объекты своего класса.
soon
2537 / 1302 / 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
2537 / 1302 / 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
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 23:26     Наследование ostream #33
Цитата Сообщение от soon Посмотреть сообщение
friend Foo& operator<<(Foo& f, const char*) override
override подчёркивает. Требует точку с запятой.
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
10.07.2012, 23:28     Наследование ostream #34
Цитата Сообщение от alsav22 Посмотреть сообщение
override подчёркивает. Требует точку с запятой.
Удалите, он там ни к чему. От прошлых экспериметов остался.
alsav22
5415 / 4811 / 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
Еще ссылки по теме:

C++ [Error] 'ostream' does not name a type
Ofstream and ostream C++
Наследование от std::ostream C++
Состояние ostream C++
Шаблонный ostream C++

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

Или воспользуйтесь поиском по форуму:
soon
2537 / 1302 / 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
Ответ Создать тему
Опции темы

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