64 / 45 / 20
Регистрация: 04.12.2018
Сообщений: 334
|
||||||||||||||||
1 | ||||||||||||||||
Перегрузка оператора <<19.07.2019, 00:32. Показов 1927. Ответов 22
Метки нет (Все метки)
В чем проблема?
0
|
19.07.2019, 00:32 | |
Ответы с готовыми решениями:
22
Перегрузка оператора == Перегрузка оператора ^ Перегрузка оператора + перегрузка оператора! |
Комп_Оратор)
|
||||||
22.07.2019, 01:32 | 21 | |||||
что и требовалось
Остаётся понять, зачем вы наобъявляли сеттеров и не бросили им по косточке. Смотрите, вы обращаетесь к приватным полям напрямую: Тут без friend объявления не обойтись. Но если бы вы использовали сеттеров, то и без friend всё бы работало
0
|
64 / 45 / 20
Регистрация: 04.12.2018
Сообщений: 334
|
|
22.07.2019, 01:41 [ТС] | 22 |
IGPIGP, Хорошо
Если использовать friend,то можно обойтись без Setеров,так как мы напрямую обращаемся к полям,в ином случае Setеры необходимы
0
|
Комп_Оратор)
|
||||||
22.07.2019, 10:18 | 23 | |||||
Нет. Не торопитесь делать выводы. friend нужен когда у свободной функции должно быть право обращения к приватным полям. Тут вопрос в том, когда же мы не можем обойтись без функции инкапсулируемой в класс членом объекта, но имеющей доступ к приватным полям.
Это происходит при написании операторов в которых объект является операндом объекта другого класса, например. cout - объект такого класса и у него как у потока есть операторы << >>. Это его операторы. Но в программировании многое стоит на голове и чувствует себя отлично. Поэтому принято говорить что мы перегружаем оператор сдвига для пользовательского класса. А пользовательский класс (объект вернее) - всего лишь параметр перегрузки. Маленькая проблема в том, что допустив конфронтацию со здравым смыслом единожды, порождается лавина проблем. В данном случае, наш объект как и положено параметру, расположен справа от оператора (слева - объект потока - полноправный хозяин оператора если бы он был членом класса). Поэтому приходится делать оператор свободной функцией. И ей приходится делегировать право доступа. Иногда требуется скрыть конструкторы, чтобы не допустить создание объекта класса в свободном режиме. Тогда, пишут функцию которая использует скрытый конструктор для создания экземпляра и создаёт и возвращает его. Тут решается парадокс Рассела - Бога в постановке: Бог может создать всё и он создал всё. Бог не может создать себя. То есть, конструктор - метод объекта. Он не запускается на объекте как обычный метод (объекта ещё нет), но он запускается от имени будущего объекта. Создать объект без конструктора нельзя. Но если его закрыть, то получить доступ через акзессор не выйдет. Объекта ведь нет ещё и нельзя запустить ни один его метод, поэтому. Обращаемся к помощи друга - свободной или статической функции. У неё есть доступ к конструкторам и др. приватным членам. Хочется сказать, - "Не торопитесь с выводами, всё сложнее чем кажется". Но мы же понимаем, что для понимания нужно думать и спрашивать. Поэтому, скажу - "Торопитесь с выводами", мы тут чтобы помочь) А акзессоры - поддержка инкапсуляции. В общем случае, нельзя от них отказываться. Добавлено через 18 минут Для успешной перегрузки без friend нужно не забыть, ещё квалификаторы соблюсти:
0
|
22.07.2019, 10:18 | |
22.07.2019, 10:18 | |
Помогаю со студенческими работами здесь
23
Перегрузка оператора + Перегрузка оператора + Перегрузка оператора Перегрузка оператора > Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |