Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
64 / 45 / 20
Регистрация: 04.12.2018
Сообщений: 334

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

19.07.2019, 00:32. Показов 2655. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В чем проблема?
C++
1
2
//Заголовочный файл
std:: ostream& operator <<(std::ostream& out, const Planet& value);
C++
1
2
3
4
5
std::ostream& operator <<(std::ostream& out, const Planet& value)
{
    //Файл Planet.cpp
    return(out << value.GetName() << " " << value.GetWay());
}
C++
1
2
Planet pl(name,21,c);
cout << pl;
Вот такую ошибку выдает
Миниатюры
Перегрузка оператора <<  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.07.2019, 00:32
Ответы с готовыми решениями:

Перегрузка оператора ==
Я уже встречала подобный вопрос на этом форуме, но у меня всё равно что-то не получается Вот виртуальная ф-ция, которую я вызываю в...

Перегрузка оператора ^
Здравствуйте! Необходимо перегрузить бинарный оператор ^ для транспонирования матрицы. Есть класс матрицы: template &lt;class T&gt; ...

Перегрузка оператора +
Написал для перегрузки оператора + class BoolMatrix { private: int feet; public: BoolMatrix(int f): feet(f) {} ...

22
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.07.2019, 01:32
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Макрой Посмотреть сообщение
C++
1
2
3
private:
char* name;
int Way;
что и требовалось до показать.
Остаётся понять, зачем вы наобъявляли сеттеров и не бросили им по косточке. Смотрите, вы обращаетесь к приватным полям напрямую:
Цитата Сообщение от Макрой Посмотреть сообщение
C++
1
2
3
4
std::istream& operator >> (std::istream& in, Planet& value)
{
return in >> value.name >> value.Way >> value.sputnik;
}
Тут без friend объявления не обойтись. Но если бы вы использовали сеттеров, то и без friend всё бы работало

C++
1
2
3
4
5
6
7
8
9
10
11
12
std::istream& operator >> (std::istream& in, Planet& value)
{
int w;
std::cout<<"Enter int way ";
std::cin>>w;
value.SetWay(w);
std::cout<<"Enter c-str name < 10 symbs (or get a boo) ";
char n[10];
std::cin>>n;
value.SetName(n);
return in ;
}
или около того. Проверьте, т.к. я не компилировал и код подробно не смотрел. Спать надо)
0
64 / 45 / 20
Регистрация: 04.12.2018
Сообщений: 334
22.07.2019, 01:41  [ТС]
IGPIGP, Хорошо
Если использовать friend,то можно обойтись без Setеров,так как мы напрямую обращаемся к полям,в ином случае Setеры необходимы
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
22.07.2019, 10:18
Цитата Сообщение от Макрой Посмотреть сообщение
Если использовать friend,то можно обойтись без Setеров,так как мы напрямую обращаемся к полям,в ином случае Setеры необходимы
Нет. Не торопитесь делать выводы. friend нужен когда у свободной функции должно быть право обращения к приватным полям. Тут вопрос в том, когда же мы не можем обойтись без функции инкапсулируемой в класс членом объекта, но имеющей доступ к приватным полям.

Это происходит при написании операторов в которых объект является операндом объекта другого класса, например.
cout - объект такого класса и у него как у потока есть операторы << >>. Это его операторы. Но в программировании многое стоит на голове и чувствует себя отлично. Поэтому принято говорить что мы перегружаем оператор сдвига для пользовательского класса. А пользовательский класс (объект вернее) - всего лишь параметр перегрузки. Маленькая проблема в том, что допустив конфронтацию со здравым смыслом единожды, порождается лавина проблем. В данном случае, наш объект как и положено параметру, расположен справа от оператора (слева - объект потока - полноправный хозяин оператора если бы он был членом класса). Поэтому приходится делать оператор свободной функцией. И ей приходится делегировать право доступа.

Иногда требуется скрыть конструкторы, чтобы не допустить создание объекта класса в свободном режиме. Тогда, пишут функцию которая использует скрытый конструктор для создания экземпляра и создаёт и возвращает его. Тут решается парадокс Рассела - Бога в постановке: Бог может создать всё и он создал всё. Бог не может создать себя.
То есть, конструктор - метод объекта. Он не запускается на объекте как обычный метод (объекта ещё нет), но он запускается от имени будущего объекта. Создать объект без конструктора нельзя. Но если его закрыть, то получить доступ через акзессор не выйдет. Объекта ведь нет ещё и нельзя запустить ни один его метод, поэтому. Обращаемся к помощи друга - свободной или статической функции. У неё есть доступ к конструкторам и др. приватным членам.

Хочется сказать, - "Не торопитесь с выводами, всё сложнее чем кажется". Но мы же понимаем, что для понимания нужно думать и спрашивать. Поэтому, скажу - "Торопитесь с выводами", мы тут чтобы помочь)

А акзессоры - поддержка инкапсуляции. В общем случае, нельзя от них отказываться.

Добавлено через 18 минут
Для успешной перегрузки без friend нужно не забыть, ещё квалификаторы соблюсти:
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
#include <iostream>
 
using namespace std;
class A
{
    int a;
public:
    A(int a_=0):a(a_){}
    int geta()const{return a;}//const важен так как будет вызов на константной ссылке
    void seta(int a_){a=a_;}
};
 
ostream& operator<<(ostream &os, const A &a)
{
    return os<<a.geta();
}
 
istream& operator>>(istream &os, A &a)
{
    int i;
    os>>i;
    a.seta(i);
    return os;
}
 
int main()
{
    A a{123};
    cout<<a;
    cin>>a;
    cout<<a;
    return 0;
}
То есть, именно акзессоры и позволяют это сделать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.07.2019, 10:18

перегрузка оператора!
Помогите сложить диагонали , при помоши перегрузки оператора+, чтобы можно было написать в maine: c1+c2+c3.заранее спасибо! ...

Перегрузка оператора +
Добрый день)Почему то не работает перегрузка оператора сложения) #include &lt;iostream&gt; #include &lt;string&gt; #include...

Перегрузка оператора +
не получается в своем классе перегрузить оператор + :( пишет &quot;error C2804: бинарный &quot;operator +&quot; имеет слишком много...

Перегрузка оператора
Имеется код: #include &lt;iostream&gt; class X { public: int a; int b; int operator+(int a) {

Перегрузка оператора >
Добрый день! #include &lt;stdio.h&gt; #include &lt;tchar.h&gt; #include &lt;iostream&gt; template &lt;typename T1, typename T2&gt; bool ...


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

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru