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

дружественные функции в C++. Когда без них невозможно? - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
12.09.2012, 22:20     дружественные функции в C++. Когда без них невозможно? #1
Здравствуйте! Есть ли ситуации, когда без дружественных функций невозможно обойтись
или всегда можно заменить ее обычной функцией/методом? Если без нее обойтись нельзя, напишите пожалуйста пример) Т.е. по сути friend-функция просто избавляет от написания дополнительных функций для возврата тех значений, которые как бы и не обязательно возвращать, но из-за невозможности доступа в обычных функциях к скрытым полям класса приходится? И только?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 01:45     дружественные функции в C++. Когда без них невозможно? #21
Цитата Сообщение от Jupiter Посмотреть сообщение
не то, ибо operator+ не должен модифицировать сам объект для которого предполагается вызов
Даже больше: он вообще должен быть const, принимать const и возвращать const xD Но это какбы не мешает ему жить в классе к которому он имеет непосредственное отношение, а наверно даже помогает
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.09.2012, 01:57     дружественные функции в C++. Когда без них невозможно? #22
Цитата Сообщение от PSIAlt Посмотреть сообщение
и возвращать const
это спорный вопрос

Цитата Сообщение от PSIAlt Посмотреть сообщение
Но это какбы не мешает ему жить в классе к которому он имеет непосредственное отношение, а наверно даже помогает
чем меньше свойств и методов тем лучше
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6230 / 2959 / 287
Регистрация: 04.12.2011
Сообщений: 7,896
Записей в блоге: 3
13.09.2012, 02:54     дружественные функции в C++. Когда без них невозможно? #23
У Г. Шилдта в "C++ Базовы курс" 3-е изд. в главе "Перегрузка операторов с использованием функций не членов класса.", приводится пример использования функции friend для перегрузки оператора сложения. Там говорится, что при перегрузке бинарной операции методом класса, первым параметром ей передается левый операнд (неявно), a вторым, - правый (явно). Это работает для случая a+b или случая a+10, но не подходит для вычисления выражения 10+а. Поэтому для перегрузки используется внешняя функция, принимающая явно два параметра. И тут пишет он "... функция-дрг оказывается чрезвычайно полезной...". Далее по тексту видно, что такую перегрузку можно выполнить и внешней функцией. Но тогда различий, кроме как только в скорости доступа к защищенным полям и не обнаруживается (внешней функции требуется вызывать функцию член через экземпляр переданный справа). Для сложения числа с 3D_Point из его примера - требуется три раза вызвать. А для умножения матрицы 5x5 на число, - 25 раз. Может в этом и дело?
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
13.09.2012, 07:21  [ТС]     дружественные функции в C++. Когда без них невозможно? #24
Цитата Сообщение от IGPIGP Посмотреть сообщение
Далее по тексту видно, что такую перегрузку можно выполнить и внешней функцией
под внешней разумеется

cName & operator+(const cName & obj1, const cName & obj2)
{
return cName(obj.get_val() + obj.get_val());
}

?

Если да, то почему только через экземпляр справа?

Цитата Сообщение от IGPIGP Посмотреть сообщение
внешней функции требуется вызывать функцию член через экземпляр переданный справа

Цитата Сообщение от IGPIGP Посмотреть сообщение
Для сложения числа с 3D_Point из его примера - требуется три раза вызвать.
Три раза вызвать, в смысле имеется три поля в классе A: x,y,z и для каждого поля есть свой метод get_x(),...,get_z() и во внешней функции вызываются все три метода подряд? Т.е. как бы

cName & operator+(const int & obj1, const cName & obj2)
{
return cName(obj1*obj2.get_x(),...,obj1*obj2.get_z());
}

?

Добавлено через 2 минуты
можно же сделать, чтобы он вернул вектор, т.е. написать один такой getVector, который возвращал бы сразу x,y,z...
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 10:37     дружественные функции в C++. Когда без них невозможно? #25
Цитата Сообщение от Jupiter Посмотреть сообщение
Цитата Сообщение от PSIAlt Посмотреть сообщение
возвращать const
это спорный вопрос
Бывают конечно ситуации, но вообще вопрос слабо спорный. operator+ равно как и другие математические операторы должны возврачать const - это если по-хорошему делать. См. Мейерса
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7954 / 4716 / 318
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
13.09.2012, 12:56     дружественные функции в C++. Когда без них невозможно? #26
PSIAlt, Нет. Это спорный вопрос. Слишком спорный, чтобы советовать использовать возвращение констант.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6230 / 2959 / 287
Регистрация: 04.12.2011
Сообщений: 7,896
Записей в блоге: 3
13.09.2012, 13:36     дружественные функции в C++. Когда без них невозможно? #27
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
под внешней разумеется

cName & operator+(const cName & obj1, const cName & obj2)
{
return cName(obj.get_val() + obj.get_val());
}

?

Если да, то почему только через экземпляр справа?
Пример же для бинарной операции со встроенным типом слева от оператора:
C++
1
2
3
4
int a;
Class B;
Class C=a*B;//слева int, а справа эземпляр (он и передается)
C=10+B;//та же песня

Три раза вызвать, в смысле имеется три поля в классе A: x,y,z и для каждого поля есть свой метод get_x(),...,get_z() и во внешней функции вызываются все три метода подряд? Т.е. как бы

cName & operator+(const int & obj1, const cName & obj2)
{
return cName(obj1*obj2.get_x(),...,obj1*obj2.get_z());
}
?
Добавлено через 2 минуты
можно же сделать, чтобы он вернул вектор, т.е. написать один такой getVector, который возвращал бы сразу x,y,z...
Это ж еще дольше. Ведь в конечном счёте, вектор и число, непосредственно, сложить или умножить нельзя. Всё равно, где-то придется распотрошить, до типов которые можно сложить. В итоги ещё и через промежуточный класс, обращаться. Это ж дольше?
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 13:52     дружественные функции в C++. Когда без них невозможно? #28
Цитата Сообщение от ForEveR Посмотреть сообщение
PSIAlt, Нет. Это спорный вопрос. Слишком спорный, чтобы советовать использовать возвращение констант.
Секундочку, речь идет только про operator+, operator* и аналогичные.
Интересно, зачем может понадобиться поменять результат сложения? Можно взять результат и использовать его для каких-то других вычислений, сохранить или еще что. Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Хотя, конечно если кто-то все еще пишет классы в которых operator+ делает что-то не имеющего ничего общего со сложенем, то да... Но надеюсь такие кодеры вымерли.
IGPIGP
Комп_Оратор)
 Аватар для IGPIGP
6230 / 2959 / 287
Регистрация: 04.12.2011
Сообщений: 7,896
Записей в блоге: 3
13.09.2012, 14:22     дружественные функции в C++. Когда без них невозможно? #29
Цитата Сообщение от PSIAlt Посмотреть сообщение
Секундочку, речь идет только про operator+, operator* и аналогичные.
Интересно, зачем может понадобиться поменять результат сложения? Можно взять результат и использовать его для каких-то других вычислений, сохранить или еще что. Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Хотя, конечно если кто-то все еще пишет классы в которых operator+ делает что-то не имеющего ничего общего со сложенем, то да... Но надеюсь такие кодеры вымерли.
PSIAlt, думаю речь о бинарных операторах вообще, а не только для + и * , например для - тоже. И как вычесть если не дистрибутивная операция? Надо же 10-a получить, а не а-10. Конечно можно объяснить юзеру, что Ваш класс это делает так: -(a-10), но зачем? А если у Вас перегружена операция > , то и < перегружать (?) или дать возможность сравнить большую матрицу с числом так: if(10>a). Пусть живут разные кодеры.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1237 / 986 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.09.2012, 17:04     дружественные функции в C++. Когда без них невозможно? #30
Цитата Сообщение от PSIAlt Посмотреть сообщение
Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Да, думаю, дело больше в том, что в Си++ есть такая штука как const-qualified методы. И если в результате сложения надо вернуть класс, который трогать нельзя, то придётся копировать результат сложения в переменную, чтобы вызывать его не-const метод, но который хоть фактически может быть const (то есть не изменять состояние объекта), но cv-правила дадут по рукам за попытку его вызвать. А взять и дописать ему const нельзя. Разве что снимать constness с помощью const_cast, что тоже не ахти.

Вместо того, чтобы сделать это в одной строке гораздо понятнее и без всяких извращений. Это не дело метода (тем более внешнего), что потом будут делать с возвращаемым им значением.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2012, 14:22     дружественные функции в C++. Когда без них невозможно?
Еще ссылки по теме:

C++ Дружественные функции
Дружественные функции С++ C++
Дружественные функции C++
C++ Дружественные функции
Бывает ли ситуация, когда невозможно решить задачу без безымянных namespaces? C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4945 / 3021 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
15.09.2012, 14:22     дружественные функции в C++. Когда без них невозможно? #31
Цитата Сообщение от romex Посмотреть сообщение
Это часто бывает костылем.
Обычно это называется соблюдением инкапсуляции. Следует всегда придерживаться принципа наименьших привилегий.
Yandex
Объявления
15.09.2012, 14:22     дружественные функции в C++. Когда без них невозможно?
Ответ Создать тему
Опции темы

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