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

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

14.02.2020, 00:37. Показов 1370. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru