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

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

14.02.2020, 00:37. Показов 1373. Ответов 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
9005 / 4706 / 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
9005 / 4706 / 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
9005 / 4706 / 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
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru