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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
#1

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

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

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

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

Перегрузка операторов - C++
Доброго времени суток! Столкнулся с такой проблемой, перегрузка операторов. Имею работающий код, но не смог сделать по своему заданию. ...

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

Перегрузка операторов - C++
Решите пожалуйсто задачу: Разработайте программу, в которой реализована перегрузка оператора «^». Оператор «^» должен возводить...

[c++] Перегрузка операторов - C++
Не работает. #include &lt;conio.h&gt; #include &lt;iostream.h&gt; #pragma argsused struct FazzyNumber { double x; double x1,x2; ...

C++ перегрузка операторов - C++
люди такая ситуация кто может в краце объясните перегрузку операторов мне например надо перегрузить оператор умножения что бы умножить...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2463 / 1635 / 238
Регистрация: 24.11.2012
Сообщений: 4,022
30.07.2013, 15:54 #2
Да нормальный вариант с френдом, нечего загромождать интерфейс класса.
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 16:00  [ТС] #3
А можно как-нибудь для френдовой функции организовать read-only mode для членов класса?
0
0x10
2463 / 1635 / 238
Регистрация: 24.11.2012
Сообщений: 4,022
30.07.2013, 16:03 #4
Dani, ну объект-то функция принимает по const&. Вполне себе read-only. const_cast, конечно, никто не отменял, но мы ведь не собираемся отстреливать себе ноги?
1
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2013, 16:07 #5
Цитата Сообщение от Dani Посмотреть сообщение
Так как все-таки лучше перегрузить?
лучше без всяких принт и френдов.
если у класса есть данные то у него же должны быть геттеры/сеттеры. если нет - френд
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 16:07  [ТС] #6
Jupiter, только инварианта нету, из-за чего геттерами сеттерам нету смысла.
0
Jupiter
Каратель
Эксперт С++
6554 / 3975 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2013, 16:11 #7
Dani, в каком смысле?
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 17:59  [ТС] #8
Jupiter, а в том, что в этом классе нельзя изменить эти приватные мемберы - они задаются только
конструктором, поэтому не возможности поменять их значение. Вывод - одна из немногих частей, при помощи которых можно связаться со значениями приватных мемберов. А то что нету инварианта (условия при котором значения переменных имеют смысл), это влияет на то, что не реализовывал я сеттеры, чтобы уменьшить время обработки объектов этого типа (чтоб не проверять на правильность). И тем-более это не пригодится в этом классе.
0
0x10
2463 / 1635 / 238
Регистрация: 24.11.2012
Сообщений: 4,022
30.07.2013, 18:01 #9
Dani, ну set-то никто и не заставляет делать, а что мешает сделать get-метод?
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 18:12  [ТС] #10
0x10, а в том, что get тоже требует доп. обработки. Это тоже самое, что я предлагал делать вместо friend функции, только здесь обработка идет в самой перегрузке оператора вывода.
0
Tulosba
:)
Эксперт С++
4395 / 3238 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
30.07.2013, 18:13 #11
Цитата Сообщение от 0x10 Посмотреть сообщение
ну set-то никто и не заставляет делать, а что мешает сделать get-метод?
действительно. Как-то странно начинать разговор про оператор вывода, который может вызывать set-методы.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.07.2013, 19:04 #12
Цитата Сообщение от Dani Посмотреть сообщение
а в том, что get тоже требует доп. обработки.
Какой требует обработки простой возврат переменной?
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 19:07  [ТС] #13
ForEveR, переменные содержат информацию, которую нужно вывести только после доп. обработки.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
30.07.2013, 19:08 #14
Dani, С этого и стоило начинать. В таком случае friend-ом или приватный метод print, который будет вызываться из оператора вывода или написать функцию, которая приводит в нужный вид данные. Да куча же вариантов.
1
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
30.07.2013, 19:10  [ТС] #15
ForEveR, я лишь спросил - чем лучше воспользоваться.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.07.2013, 19:10
Привет! Вот еще темы с ответами:

перегрузка операторов - C++
Всем привет. Дошел до темы перегрузки операторов и возникло два вопроса. Первый: Чем отличается вот этот код String ...

Перегрузка операторов - C++
В общем учу эту тему и ввожу код один в один как в уроке, но в уроке он компилится, а у меня нет. Ругается на &quot;c1++;&quot;, подскажите...

Перегрузка операторов - C++
Создайте класс Fraction (обыкновенная дробь), в котором реализовать перегрузку: оператора суммирования дробей, оператора суммирования дроби...

Перегрузка операторов ++ - C++
доброго времени суток. есть утечка памяти как я понимаю, но не мойму почему. о чем программа: есть обьект типа MString. В этом классе...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
30.07.2013, 19:10
Ответ Создать тему
Опции темы

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