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

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

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

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

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

Я наследовал от ostream класс, перегрузил operator<<(const char *)
для одного типа данных, и создал объект newcout, однако он почему-то не может выводить int. Почему?
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); //...

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

Не по теме:

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.07.2012, 21:40
Ответ Создать тему
Опции темы

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