Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
10 / 10 / 3
Регистрация: 23.12.2017
Сообщений: 55

Перегрузка оператора <<

14.02.2020, 00:37. Показов 1400. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, имеется 2 класса, базовый и произвольный, в базовом я перегружаю оператор << для более удобного вывода на экран, но, проблема в том, что с произвольным классом почему-то это не работает. И это очень странно, ведь произвольный класс должен преобразовываться в базовый. Но, можно сделать "костыль", и в произвольном классе повторно перегрузить этот оператор, уже с типом произвольного класса в аргументах.
Подскажите, пожалуйста, существует ли какой-то способ обойтись без "костылей", и почему не работает преобразование.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.02.2020, 00:37
Ответы с готовыми решениями:

Перегрузка оператора [][]
допустим у меня есть клас Matrix и я хочу опедилить оператор доступа к его елементу как реализовть оператор если простой масив я знаю а...

Перегрузка оператора --
Добрый день, у меня возникла небольшая проблема. Дело в том, что display() работает нормально. Только я не могу понять, что нужно сделать,...

Перегрузка оператора +
Здравствуйте. Проблема в следующем: у меня есть класс. Список, реализующий работу с полиндромом: struct Field { int a; int...

10
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.02.2020, 00:50
Цитата Сообщение от 0x1337 Посмотреть сообщение
существует ли какой-то способ обойтись без "костылей"
https://rextester.com/IVBNZ85459

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
#include <iostream>
 
#ifndef dOUT_TO_STREAM
#define dOUT_TO_STREAM(className)  \
    template<class ostream>friend  \
        ostream& operator<<(ostream& os, const className& obj)
#endif
 
struct base
{
    dOUT_TO_STREAM(base)
    {
        os << "base: " << obj.val;
        return os;
    }
    int val = 33;
};
 
 
struct der: base
{};
 
int main()
{
    der d;
    std::cout << d << '\n';
}
Цитата Сообщение от 0x1337 Посмотреть сообщение
почему не работает преобразование.
в твоём коде ошибка в 33 строке, я думаю.
0
10 / 10 / 3
Регистрация: 23.12.2017
Сообщений: 55
14.02.2020, 01:03  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
в твоём коде ошибка в 33 строке, я думаю.
Это ведь не вопрос кода, чтобы его прикладывать, с++ умеет автоматически делать подобное при работе с ссылками, указателями, и вы это знаете.
И кстати, ваш метод не работает, всё та же ошибка о невозможном преобразовании в недоступный базовый класс.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.02.2020, 01:12
Цитата Сообщение от 0x1337 Посмотреть сообщение
Это ведь не вопрос кода, чтобы его прикладывать
жди телепатов тогда.

Цитата Сообщение от 0x1337 Посмотреть сообщение
И кстати, ваш метод не работает
ссылка на онлайн компилятор не навела тебя никакие размышления?
Цитата Сообщение от hoggy Посмотреть сообщение
https://rextester.com/IVBNZ85459
Цитата Сообщение от 0x1337 Посмотреть сообщение
всё та же ошибка о невозможном преобразовании в недоступный базовый класс.
"всё тех же ошибок" не существует.

существуют только конкретные ошибки конкретного компилятора.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.02.2020, 01:24
Цитата Сообщение от 0x1337 Посмотреть сообщение
в базовом я перегружаю оператор << для более удобного вывода на экран,
0x1337, так не бывает. Этот оператор - свободный оператор и к классу он не принадлежит. Поэтому он объявляется дружественным классу, в частности. Когда вы наследуете, то наследник не имеет понятия о том, что есть такой оператор. И это правильно. Наследник, обычно, шире и ему есть что выводить помимо того что выводит базовый. Однако вы можете написать виртуальный метод, который вызывается внутри оператора << сэкономив на пальцево-кистевых усилиях.
0
10 / 10 / 3
Регистрация: 23.12.2017
Сообщений: 55
14.02.2020, 01:28  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
жди телепатов тогда.
Увы, ничем не могу помочь, у меня нет исходного кода компилятора visual studio, чтобы я скинул вам как конкретно он преобразовывает типы.
Цитата Сообщение от hoggy Посмотреть сообщение
ссылка на онлайн компилятор не навела тебя никакие размышления?
Нет, ведь у меня это не работает. Скриншот приложенный ниже не навёл вас ни на какие размышления?
Цитата Сообщение от hoggy Посмотреть сообщение
"всё тех же ошибок" не существует.
существуют только конкретные ошибки конкретного компилятора.
Это отлично, спасибо за дельное утверждение. Жаль, что это никак не помогает мне в решении проблемы и ответе на вопрос.
Миниатюры
Перегрузка оператора <<  
0
10 / 10 / 3
Регистрация: 23.12.2017
Сообщений: 55
14.02.2020, 01:38  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
0x1337, так не бывает. Этот оператор - свободный оператор и к классу он не принадлежит. Поэтому он объявляется дружественным классу, в частности. Когда вы наследуете, то наследник не имеет понятия о том, что есть такой оператор. И это правильно. Наследник, обычно, шире и ему есть что выводить помимо того что выводит базовый. Однако вы можете написать виртуальный метод, который вызывается внутри оператора << сэкономив на пальцево-кистевых усилиях.
На сколько я понял, вся проблема в том, что вторым аргументом указывается тип класса (в моём случае базового, в котором этот оператор и перегружается) и компилятор при вызове этой перегрузки из объекта наследуемого класса пытается его преобразовать в базовый, и, почему-то, не может. В теории, да и не только, это возможно, ведь нельзя преобразовать базовый класс в наследуемый - поскольку наследуемый "шире", а как раз-таки наследуемый в базовый - можно, поскольку он "уже", с ссылками и указателями это успешно работает. Хотя, скорее-всего, я что-то не так понимаю, в этом и был вопрос треда.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
14.02.2020, 01:40
Цитата Сообщение от 0x1337 Посмотреть сообщение
Увы, ничем не могу помочь, у меня нет исходного кода компилятора visual studio, чтобы я скинул вам как конкретно он преобразовывает типы.
если ты ещё не понял: у тебя в коде ошибка.
ты можешь показать свой код.
и тогда получишь конкретный ответ: почему не работает.

а можешь продолжать тупить, и ждать телепатов.

Цитата Сообщение от 0x1337 Посмотреть сообщение
Нет, ведь у меня это не работает.
потому что в твоём коде ошибка, Бро
(в 33 строке, я думаю)

Цитата Сообщение от 0x1337 Посмотреть сообщение
Скриншот приложенный ниже не навёл вас ни на какие размышления?
он навел меня на мысли о том,
что ты даже тупо скопипастить код без ошибок не смог.

посмотри внимательно:
Цитата Сообщение от hoggy Посмотреть сообщение
struct der: base
а у тебя что написанно?

Цитата Сообщение от 0x1337 Посмотреть сообщение
Жаль, что это никак не помогает мне в решении проблемы и ответе на вопрос.

есть два типа людей:

1.
приводят код, и текст ошибок компилятора.

2.
должны страдать.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.02.2020, 01:50
Лучший ответ Сообщение было отмечено 0x1337 как решение

Решение

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
#include <iostream>
using namespace std;
 
struct A
{
    A(int a_=0):a(a_){}
   int a;
   friend
   ostream &operator<<(ostream &os, const A &obj);
};
 
ostream &operator<<(ostream &os, const A &obj)
{
    return os << obj.a ;
}
 
struct B:public A
{
    B(int a_=0, int b_=0):A(a_), b(b_){}
friend
   ostream &operator<<(ostream &os, const A &obj);
   int b;
};
 
int main()
{
A oba{123};
cout<<oba<<endl;
B obb{12,34};
cout<<obb<<endl;//использование оператора через ссылку на базовый возможно, но нужно ли?
return 0;
}
1
10 / 10 / 3
Регистрация: 23.12.2017
Сообщений: 55
14.02.2020, 02:23  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
если ты ещё не понял: у тебя в коде ошибка.
ты можешь показать свой код.
и тогда получишь конкретный ответ: почему не работает.
а можешь продолжать тупить, и ждать телепатов.
Если вы ещё не поняли:ошибки в коде у меня нет, человек выше оказался телепатом, и показал мне как это работает в правильной реализации, и это, к слову, очень близко к тому, о чём я написал в самом начале треда.
Цитата Сообщение от hoggy Посмотреть сообщение
Сообщение от 0x1337
Скриншот приложенный ниже не навёл вас ни на какие размышления?
он навел меня на мысли о том,
что ты даже тупо скопипастить код без ошибок не смог.
посмотри внимательно:
Сообщение от hoggy
struct der: base
а у тебя что написанно?
А у меня написано class, потому что ВЫ не поняли что я пользуюсь классами а не структурами. Зачем вы обвиняете меня в незнании, если это ВЫ с самого начала треда не понимаете о чём разговор, что для этого не нужен код, и что ваши решения не результативны?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.02.2020, 10:38
0x1337, ругаться не стоит. Код действительно помогает, когда говоришь о том, что в коде не так.
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
#include <iostream>
using namespace std;
 
struct A
{
    A(int a_=0):a(a_){}
    virtual ~A(){}
    virtual ostream &out_me(ostream &os)const{return os<<a<<' ';}
   int a;
   friend
   ostream &operator<<(ostream &os, const A &obj);
 
};
 
ostream &operator<<(ostream &os, const A &obj)
{
    return obj.out_me(os) ;
}
 
struct B:public A
{
    B(int a_=0, int b_=0):A(a_), b(b_){}
    virtual ~B(){}
     ostream &out_me(ostream &os)const
    {
        return A::out_me(os)<<b<<' ';
    }
friend
   ostream &operator<<(ostream &os, const A &obj);
   int b;
};
 
int main()
{
A oba{123};
cout<<oba<<endl;
B obb{12,34};
cout<<obb<<endl;
return 0;
}
Это далеко не вся правда. Потому что С++ это мир, а в мире нет всей правды. Для случая оператора << например, могут быть забавные моменты при попытке рекурсивного обхода рекурсивных структур данных. Для прорицательности нужно ещё и время, поэтому я тоже за то, чтобы вопрос содержал необходимо достаточное количество символов. Это идилия, конечно, потому как это уже ответ..., но стремиться нужно)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.02.2020, 10:38
Помогаю со студенческими работами здесь

Перегрузка оператора ==
Создайте класс stroka. Класс должен включать поле (массив) типа char для хранения строки. Класс должен содержать: 1) конструктор без...

Перегрузка оператора +=
Создал класс дробь. Пытаюсь перегрузить оператор += (или -=, *=, /=) А компилятор выдаёт ошибку 'drob operator+=(drob&amp;)' must take...

Перегрузка оператора
Здравствуйте! Помогите разобраться с перегрузкой операторов. Суть задания: Осуществите перегрузку оператора “++” так, чтобы при его...

Перегрузка оператора ++
Нужно создать операторы префиксного и постфиксного инкремента для приращения переменной itsRadius класса SimpleCircle. Переменная itsRadius...

Перегрузка оператора +=
У меня имеется структура и метод, который вызывается след образом: A.plus_and_minus(B); Есть огромное желание перегрузить функцию += ,...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru