Форум программистов, компьютерный форум CyberForum.ru

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

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

C++ Перегрузка операторов(=,+)
C++ Перегрузка операторов С++
C++ перегрузка операторов
C++ Перегрузка операторов
C++ Перегрузка операторов
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.07.2013, 15:54     Перегрузка операторов #2
Да нормальный вариант с френдом, нечего загромождать интерфейс класса.
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 16:00  [ТС]     Перегрузка операторов #3
А можно как-нибудь для френдовой функции организовать read-only mode для членов класса?
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.07.2013, 16:03     Перегрузка операторов #4
Dani, ну объект-то функция принимает по const&. Вполне себе read-only. const_cast, конечно, никто не отменял, но мы ведь не собираемся отстреливать себе ноги?
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2013, 16:07     Перегрузка операторов #5
Цитата Сообщение от Dani Посмотреть сообщение
Так как все-таки лучше перегрузить?
лучше без всяких принт и френдов.
если у класса есть данные то у него же должны быть геттеры/сеттеры. если нет - френд
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 16:07  [ТС]     Перегрузка операторов #6
Jupiter, только инварианта нету, из-за чего геттерами сеттерам нету смысла.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2013, 16:11     Перегрузка операторов #7
Dani, в каком смысле?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 17:59  [ТС]     Перегрузка операторов #8
Jupiter, а в том, что в этом классе нельзя изменить эти приватные мемберы - они задаются только
конструктором, поэтому не возможности поменять их значение. Вывод - одна из немногих частей, при помощи которых можно связаться со значениями приватных мемберов. А то что нету инварианта (условия при котором значения переменных имеют смысл), это влияет на то, что не реализовывал я сеттеры, чтобы уменьшить время обработки объектов этого типа (чтоб не проверять на правильность). И тем-более это не пригодится в этом классе.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
30.07.2013, 18:01     Перегрузка операторов #9
Dani, ну set-то никто и не заставляет делать, а что мешает сделать get-метод?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 18:12  [ТС]     Перегрузка операторов #10
0x10, а в том, что get тоже требует доп. обработки. Это тоже самое, что я предлагал делать вместо friend функции, только здесь обработка идет в самой перегрузке оператора вывода.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.07.2013, 18:13     Перегрузка операторов #11
Цитата Сообщение от 0x10 Посмотреть сообщение
ну set-то никто и не заставляет делать, а что мешает сделать get-метод?
действительно. Как-то странно начинать разговор про оператор вывода, который может вызывать set-методы.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.07.2013, 19:04     Перегрузка операторов #12
Цитата Сообщение от Dani Посмотреть сообщение
а в том, что get тоже требует доп. обработки.
Какой требует обработки простой возврат переменной?
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 19:07  [ТС]     Перегрузка операторов #13
ForEveR, переменные содержат информацию, которую нужно вывести только после доп. обработки.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
30.07.2013, 19:08     Перегрузка операторов #14
Dani, С этого и стоило начинать. В таком случае friend-ом или приватный метод print, который будет вызываться из оператора вывода или написать функцию, которая приводит в нужный вид данные. Да куча же вариантов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2013, 19:10     Перегрузка операторов
Еще ссылки по теме:

C++ Перегрузка операторов + и =
Перегрузка операторов C++
C++ Перегрузка операторов +=, -=, *= и /=

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

Или воспользуйтесь поиском по форуму:
Dani
1263 / 621 / 50
Регистрация: 11.08.2011
Сообщений: 2,236
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 19:10  [ТС]     Перегрузка операторов #15
ForEveR, я лишь спросил - чем лучше воспользоваться.
Yandex
Объявления
30.07.2013, 19:10     Перегрузка операторов
Ответ Создать тему
Опции темы

Текущее время: 03:27. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru