Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

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

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

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

istream, ostream - C++
Есть задача по сохранению в файл и восстановлении из файла объекта. Функции надо сделать такие: void Serialize(std::ostream &amp; stream); //...

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

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

Да и по теме-то ты знаешь чего?
0
alsav22
5436 / 4831 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 18:29 #6
Цитата Сообщение от Ksan Посмотреть сообщение
Я наследовал от ostream класс, перегрузил operator<<(const char *)
для одного типа данных, и создал объект newcout, однако он почему-то не может выводить int. Почему?
У меня компилятор пишет, что " для класса std::basic_ostream<_Elem,_Traits> не существует конструктор по умолчанию", т.е. такой конструктор, как у вас, компилятор не пропускает.
0
Ksan
27 / 27 / 0
Регистрация: 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
ForEveR
В астрале
Эксперт С++
7992 / 4751 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
10.07.2012, 18:38 #8
Ksan, Да-с, только теперь в этом коде закройте конструктор по умолчанию в A, тупо объявите его в private секции и попробуйте)
0
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:40  [ТС] #9
ForEveR, объяснишь, почему так?
0
alsav22
5436 / 4831 / 442
Регистрация: 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
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 18:56  [ТС] #11
alsav22, убрал конструктор. Но все равно, инты не выводит
0
alsav22
5436 / 4831 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.07.2012, 19:04 #12
Цитата Сообщение от Ksan Посмотреть сообщение
alsav22, убрал конструктор. Но все равно, инты не выводит
Если конструктор убрали, то кто тогда должен выводить? Без конструктора объект создали? Весь код нужен.
0
Ksan
27 / 27 / 0
Регистрация: 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
alsav22
5436 / 4831 / 442
Регистрация: 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
Ksan
27 / 27 / 0
Регистрация: 02.11.2010
Сообщений: 370
10.07.2012, 21:40  [ТС] #15
alsav22, русский язык выводит корректно
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2012, 21:40
Привет! Вот еще темы с ответами:

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

Ofstream and ostream - C++
Как мне определить одну переменную для обоих потоков ? т .ею есть ффункция void Show(??? &amp;out) { out &lt;&lt; &quot; ...

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

Класс ostream - C++
Как можно создать класс ostream? Такое ощущение, что кроме cout ничего из этого класса создать невозможно.


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

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

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