Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Dani
1398 / 642 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
1

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

30.07.2013, 15:51. Просмотров 736. Ответов 14
Метки нет (Все метки)

Всем привет. Предположим, что нужно перегрузить оператор вывода << для какого-то класса, определенного мной. Этот оператор должен выводить приватные члены класса, поэтому его можно определить его как friend. Однако, friend нарушает логику ООП (читал, что если вообще возможно обойтись без friend, то лучше обойтись), поэтому можно попробовать определить public функцию print, и затем ее вызывать из функции перегруженного оператора. Но это добавит лишних строк и лишнюю паблик функцию, которая вызывается только в 1 месте. Так как все-таки лучше перегрузить?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2013, 15:51
Ответы с готовыми решениями:

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в...

Перегрузка операторов С++
Всем привет!:) Помогите пожалуйста разобраться в коде. Я сооооовсем начинающий и сейчас учу с++ по...

перегрузка операторов
Встала проблема с перегрузкой операторов. Обычные типа --, или += я вроде как написать смог, но...

Перегрузка операторов <<, >>
у меня есть класс, к примеру template &lt;typename type&gt; class ls { private: type val;...

Перегрузка операторов
я учусь перегружать операторы,но не получается,выдает exception class Student { public:...

14
0x10
2850 / 1934 / 327
Регистрация: 24.11.2012
Сообщений: 4,740
30.07.2013, 15:54 2
Да нормальный вариант с френдом, нечего загромождать интерфейс класса.
1
Dani
1398 / 642 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 16:00  [ТС] 3
А можно как-нибудь для френдовой функции организовать read-only mode для членов класса?
0
0x10
2850 / 1934 / 327
Регистрация: 24.11.2012
Сообщений: 4,740
30.07.2013, 16:03 4
Dani, ну объект-то функция принимает по const&. Вполне себе read-only. const_cast, конечно, никто не отменял, но мы ведь не собираемся отстреливать себе ноги?
1
Jupiter
Каратель
Эксперт С++
6585 / 4006 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2013, 16:07 5
Цитата Сообщение от Dani Посмотреть сообщение
Так как все-таки лучше перегрузить?
лучше без всяких принт и френдов.
если у класса есть данные то у него же должны быть геттеры/сеттеры. если нет - френд
1
Dani
1398 / 642 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 16:07  [ТС] 6
Jupiter, только инварианта нету, из-за чего геттерами сеттерам нету смысла.
0
Jupiter
Каратель
Эксперт С++
6585 / 4006 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2013, 16:11 7
Dani, в каком смысле?
0
Dani
1398 / 642 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 17:59  [ТС] 8
Jupiter, а в том, что в этом классе нельзя изменить эти приватные мемберы - они задаются только
конструктором, поэтому не возможности поменять их значение. Вывод - одна из немногих частей, при помощи которых можно связаться со значениями приватных мемберов. А то что нету инварианта (условия при котором значения переменных имеют смысл), это влияет на то, что не реализовывал я сеттеры, чтобы уменьшить время обработки объектов этого типа (чтоб не проверять на правильность). И тем-более это не пригодится в этом классе.
0
0x10
2850 / 1934 / 327
Регистрация: 24.11.2012
Сообщений: 4,740
30.07.2013, 18:01 9
Dani, ну set-то никто и не заставляет делать, а что мешает сделать get-метод?
0
Dani
1398 / 642 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 18:12  [ТС] 10
0x10, а в том, что get тоже требует доп. обработки. Это тоже самое, что я предлагал делать вместо friend функции, только здесь обработка идет в самой перегрузке оператора вывода.
0
Tulosba
:)
Эксперт С++
4759 / 3253 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
30.07.2013, 18:13 11
Цитата Сообщение от 0x10 Посмотреть сообщение
ну set-то никто и не заставляет делать, а что мешает сделать get-метод?
действительно. Как-то странно начинать разговор про оператор вывода, который может вызывать set-методы.
0
ForEveR
В астрале
Эксперт С++
8014 / 4771 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.07.2013, 19:04 12
Цитата Сообщение от Dani Посмотреть сообщение
а в том, что get тоже требует доп. обработки.
Какой требует обработки простой возврат переменной?
0
Dani
1398 / 642 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 19:07  [ТС] 13
ForEveR, переменные содержат информацию, которую нужно вывести только после доп. обработки.
0
ForEveR
В астрале
Эксперт С++
8014 / 4771 / 654
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
30.07.2013, 19:08 14
Dani, С этого и стоило начинать. В таком случае friend-ом или приватный метод print, который будет вызываться из оператора вывода или написать функцию, которая приводит в нужный вид данные. Да куча же вариантов.
1
Dani
1398 / 642 / 134
Регистрация: 11.08.2011
Сообщений: 2,299
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 19:10  [ТС] 15
ForEveR, я лишь спросил - чем лучше воспользоваться.
0
30.07.2013, 19:10
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2013, 19:10

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Перегрузка операторов
Добрый вечер, вопрос в том, что я пытаюсь перегрузить оператор ++ постфиксно, но на нем падает...

Перегрузка операторов
В общем задание следующее: Создайте класс chess (шахматы), в котором хранятся поля шахматной доски...

Перегрузка операторов
Ошибка: &quot;error: invalid operands to binary expression ('Number *' and 'Number *') n3 = n1 * n2;&quot;...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.