Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
1

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

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

Я наследовал от 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
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 17:29 2
Цитата Сообщение от Ksan Посмотреть сообщение
Я наследовал от ostream класс, перегрузил operator<<(const char *)
для одного типа данных, и создал объект newcout, однако он почему-то не может выводить int. Почему?
Код посмотреть бы. Компилятор что-нибудь пишет?
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 17:40  [ТС] 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);
0
Jupiter
10.07.2012, 18:13
  #4

Не по теме:

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

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

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

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

C++
1
2
3
4
5
6
7
8
9
10
class A
{
  public:
    void func(){}
};
 
class B : public A
{
 
};
0
В астрале
Эксперт С++
8028 / 4785 / 654
Регистрация: 24.06.2010
Сообщений: 10,558
10.07.2012, 18:38 8
Ksan, Да-с, только теперь в этом коде закройте конструктор по умолчанию в A, тупо объявите его в private секции и попробуйте)
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:40  [ТС] 9
ForEveR, объяснишь, почему так?
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 18:53 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;}
 
};
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:56  [ТС] 11
alsav22, убрал конструктор. Но все равно, инты не выводит
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 19:04 12
Цитата Сообщение от Ksan Посмотреть сообщение
alsav22, убрал конструктор. Но все равно, инты не выводит
Если конструктор убрали, то кто тогда должен выводить? Без конструктора объект создали? Весь код нужен.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 19:07  [ТС] 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, а там выводы интов есть
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 21:38 14
Цитата Сообщение от Ksan Посмотреть сообщение
Он же должен наследовать функции ostream
Должен. Если создадите объект класса Rostream. А создать его невозможно. Почему я уже объяснил.
Наследование как раз и заключается в том, что в объекте производного класса присутствует и объект базового класса. А при создании объекта вашего класса, объект базового не может быть создан.

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

Добавлено через 2 часа 12 минут
Цитата Сообщение от Ksan Посмотреть сообщение
Он же должен наследовать функции ostream, а там выводы интов есть
Там есть, но вы же хотите, чтобы объёкт вашего класса выводил int с помощью <<. Значит << надо перегрузить и для int.
0
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 21:40  [ТС] 15
alsav22, русский язык выводит корректно
0
5477 / 4872 / 831
Регистрация: 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
27 / 27 / 4
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 22:03  [ТС] 17
alsav22, объясни что ты сделал и что такое filebuf?
0
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:10 18
Для конструктора объекта ostream нужен объект streambuf http://www.cplusplus.com/refer... m/ostream/ Единственное, что я нашёл подходящего, это filebuf (буфер для файлового ввода- вывода). Наверное, можно как-то и по другому сделать. Тут у меня знаний не хватает.
0
27 / 27 / 4
Регистрация: 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
5477 / 4872 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 22:14 20
Цитата Сообщение от Ksan Посмотреть сообщение
alsav22, объясни что ты сделал и что такое filebuf?
Ничего особенного не делал. Нужно было выяснить, как создать объект ostream, чтобы использовать это в конструкторе Rostream.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2012, 22:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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;...


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

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

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