Форум программистов, компьютерный форум 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++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 17:29     Наследование ostream #2
Цитата Сообщение от Ksan Посмотреть сообщение
Я наследовал от ostream класс, перегрузил operator<<(const char *)
для одного типа данных, и создал объект newcout, однако он почему-то не может выводить int. Почему?
Код посмотреть бы. Компилятор что-нибудь пишет?
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 17:40  [ТС]     Наследование ostream #3
alsav22,

C++
1
2
ambiguous overload for 'operator<<' in 'rcout << 10' 
candidates are: Rostream& Rostream::operator<<(const char*) <near match>
Ну и дальше кандидаты

Код

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
class Rostream : public ostream
{
        public:
                Rostream(Rostream *self)
                {
                        _alphabet = "Г*áâãäå¸æçèéêëìГ*îïðñòóôõö÷øùúûüýþÿ";
                        _self = self;
                }
                Rostream& operator<<(const char *chbuff)
                {
                        char chbuff2[2] = "q";
                        
                        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 *_self;
                }
                /*Rostream& operator<<(const int val)
                {
                        cout << val;
                        return *_self;
                }*/
        private:
                string _alphabet;
                Rostream *_self;
}rcout(&rcout);
Jupiter
10.07.2012, 18:13
  #4

Не по теме:

Цитата Сообщение от Ksan Посмотреть сообщение
for(int i=0; i<strlen(chbuff);

Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:28  [ТС]     Наследование ostream #5
Jupiter, у тебя есть другой вариант?

Да и по теме-то ты знаешь чего?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 18:29     Наследование ostream #6
Цитата Сообщение от Ksan Посмотреть сообщение
Я наследовал от ostream класс, перегрузил operator<<(const char *)
для одного типа данных, и создал объект newcout, однако он почему-то не может выводить int. Почему?
У меня компилятор пишет, что " для класса std::basic_ostream<_Elem,_Traits> не существует конструктор по умолчанию", т.е. такой конструктор, как у вас, компилятор не пропускает.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:33  [ТС]     Наследование ostream #7
alsav22, почему? Я же не создаю указатель типа ostream, а просто наследую от него и создаю объект.

Это все равно, что

C++
1
2
3
4
5
6
7
8
9
10
class A
{
  public:
    void func(){}
};
 
class B : public A
{
 
};
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.07.2012, 18:38     Наследование ostream #8
Ksan, Да-с, только теперь в этом коде закройте конструктор по умолчанию в A, тупо объявите его в private секции и попробуйте)
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:40  [ТС]     Наследование ostream #9
ForEveR, объяснишь, почему так?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 18:53     Наследование ostream #10
Цитата Сообщение от Ksan Посмотреть сообщение
alsav22, почему? Я же не создаю указатель типа ostream, а просто наследую от него и создаю объект.

Это все равно, что

C++
1
2
3
4
5
6
7
8
9
10
class A
{
  public:
    void func(){}
};
 
class B : public A
{
 
};
При создании объекта производного класса, всегда, сначала, создаётся объект базового класса. Поэтому, или, в конструкторе производного класса, через список инициализаторов создаётся и инициализируется объект базового класса (чего у вас нет) или это делает конструктор по умолчанию базового класса. В классе ostream такого конструктора нет.

Добавлено через 9 минут
Для примера. Вот так должно быть:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A
{
  public:
    void func(int){}
    A(int a){func(a);}
};
 
class B : public A
{
    int x;
    public:
    B(int a, int r) : A(a)
    {x = r;}
 
};
А вот так не пройдёт:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A
{
  public:
    void func(int){}
    A(int a){func(a);}
};
 
class B : public A
{
    int x;
    public:
    B(int r) 
    {x = r;}
 
};
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:56  [ТС]     Наследование ostream #11
alsav22, убрал конструктор. Но все равно, инты не выводит
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 19:04     Наследование ostream #12
Цитата Сообщение от Ksan Посмотреть сообщение
alsav22, убрал конструктор. Но все равно, инты не выводит
Если конструктор убрали, то кто тогда должен выводить? Без конструктора объект создали? Весь код нужен.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 19:07  [ТС]     Наследование ostream #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
class Rostream : public ostream
{
        public:
                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;
                }
}rcout;

Он же должен наследовать функции ostream, а там выводы интов есть
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 21:38     Наследование ostream #14
Цитата Сообщение от Ksan Посмотреть сообщение
Он же должен наследовать функции ostream
Должен. Если создадите объект класса Rostream. А создать его невозможно. Почему я уже объяснил.
Наследование как раз и заключается в том, что в объекте производного класса присутствует и объект базового класса. А при создании объекта вашего класса, объект базового не может быть создан.

Добавлено через 7 минут
И в чём, вообще, идея такой перегрузки? Обычно оператор << перегружают в своих классах для того, чтобы можно было использовать конструкции типа: cout << my_object

Добавлено через 2 часа 12 минут
Цитата Сообщение от Ksan Посмотреть сообщение
Он же должен наследовать функции ostream, а там выводы интов есть
Там есть, но вы же хотите, чтобы объёкт вашего класса выводил int с помощью <<. Значит << надо перегрузить и для int.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 21:40  [ТС]     Наследование ostream #15
alsav22, русский язык выводит корректно
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:00     Наследование ostream #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.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:03  [ТС]     Наследование ostream #17
alsav22, объясни что ты сделал и что такое filebuf?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:10     Наследование ostream #18
Для конструктора объекта ostream нужен объект streambuf http://www.cplusplus.com/reference/i...tream/ostream/ Единственное, что я нашёл подходящего, это filebuf (буфер для файлового ввода- вывода). Наверное, можно как-то и по другому сделать. Тут у меня знаний не хватает.
Ksan
26 / 26 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:14  [ТС]     Наследование ostream #19
alsav22, я пытался сделать через

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

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

Не по теме:

Я гуглил...



C++
1
Rostream(filebuf fb) : ostream(&fb)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2012, 22:14     Наследование ostream
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:14     Наследование ostream #20
Цитата Сообщение от Ksan Посмотреть сообщение
alsav22, объясни что ты сделал и что такое filebuf?
Ничего особенного не делал. Нужно было выяснить, как создать объект ostream, чтобы использовать это в конструкторе Rostream.
Yandex
Объявления
10.07.2012, 22:14     Наследование ostream
Ответ Создать тему
Опции темы

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