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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
#1

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

12.09.2012, 22:20. Просмотров 1926. Ответов 30
Метки нет (Все метки)

Здравствуйте! Есть ли ситуации, когда без дружественных функций невозможно обойтись
или всегда можно заменить ее обычной функцией/методом? Если без нее обойтись нельзя, напишите пожалуйста пример) Т.е. по сути friend-функция просто избавляет от написания дополнительных функций для возврата тех значений, которые как бы и не обязательно возвращать, но из-за невозможности доступа в обычных функциях к скрытым полям класса приходится? И только?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2012, 22:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос дружественные функции в C++. Когда без них невозможно? (C++):

Когда стоит использовать класс, а когда лучше обойтись без них? - C++
Когда стоит использовать класс, а когда лучше обойтись без них? Когда следует использовать несколько классов? Вот, например. Программа...

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

Протестировать функции заданий 13 и 14 на наличие в них операторов возврата как с выражением ,так и без него - C++
Протестировать функции заданий 13 и 14 на наличие в них операторов возврата как с выражением ,так и без него

Дружественные функции. Наследование. Перегрузка функции - C++
Здравствуйте, у меня проблема Не знаю куда Вставить имеющийся код(В какую строчку или строчки кода). Первый код это было 1 задание, 2-ой...

Дружественные функции - C++
День добрый. class Distance { private: int fut; int inch; public: Distance():fut(0),inch(0){}; Distance(int f,int...

Дружественные функции - C++
Всем привет,объясните пожалуйста,почему мой код не выводит информацию из private, даже если я указал как friend нужную функцию(наверное)....

30
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 23:28 #16
Справится, спору нет=) Но ведь не всегда есть нужда)
0
romex
44 / 44 / 4
Регистрация: 11.04.2010
Сообщений: 223
12.09.2012, 23:30 #17
Цитата Сообщение от _stealth_ Посмотреть сообщение
Но, на сколько я его понял, нужно сделать пространство имен, в нем класси о дружественные функции, как операторы (11.5 и 11.5.2 у Страуступа). Думаю это логично.
Си++ довольно гибкий язык, не обязательно делать все по одному шаблону.
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 23:32 #18
Насчет пространства имен - это связано с порядком поиска перегруженных операторов, см. Мейерса кому интересно
0
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
12.09.2012, 23:37 #19
Цитата Сообщение от PSIAlt Посмотреть сообщение
Справится, спору нет=) Но ведь не всегда есть нужда)
Да, тут конечно удобство в приоритете
Я к тому, что чтобы сохранить логику, нужно иногда использовать friend, а без них ни как.

Время поиска - это на время компиляции влиеят в смысле?
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.09.2012, 01:10 #20
Цитата Сообщение от PSIAlt Посмотреть сообщение
Цитата Сообщение от _stealth_ Посмотреть сообщение
А как реализовать operator+, если он например складывает два объекта одного класса?
Запихать в класс будет неправильным - это не есть часть класса, это некая фукнция которая производит операции над двумя обхектами этого класса и возращает третий такой.
Запихать внутрь какраз самое то.
не то, ибо operator+ не должен модифицировать сам объект для которого предполагается вызов
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 01:45 #21
Цитата Сообщение от Jupiter Посмотреть сообщение
не то, ибо operator+ не должен модифицировать сам объект для которого предполагается вызов
Даже больше: он вообще должен быть const, принимать const и возвращать const xD Но это какбы не мешает ему жить в классе к которому он имеет непосредственное отношение, а наверно даже помогает
0
Jupiter
Каратель
Эксперт С++
6559 / 3980 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.09.2012, 01:57 #22
Цитата Сообщение от PSIAlt Посмотреть сообщение
и возвращать const
это спорный вопрос

Цитата Сообщение от PSIAlt Посмотреть сообщение
Но это какбы не мешает ему жить в классе к которому он имеет непосредственное отношение, а наверно даже помогает
чем меньше свойств и методов тем лучше
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
13.09.2012, 02:54 #23
У Г. Шилдта в "C++ Базовы курс" 3-е изд. в главе "Перегрузка операторов с использованием функций не членов класса.", приводится пример использования функции friend для перегрузки оператора сложения. Там говорится, что при перегрузке бинарной операции методом класса, первым параметром ей передается левый операнд (неявно), a вторым, - правый (явно). Это работает для случая a+b или случая a+10, но не подходит для вычисления выражения 10+а. Поэтому для перегрузки используется внешняя функция, принимающая явно два параметра. И тут пишет он "... функция-дрг оказывается чрезвычайно полезной...". Далее по тексту видно, что такую перегрузку можно выполнить и внешней функцией. Но тогда различий, кроме как только в скорости доступа к защищенным полям и не обнаруживается (внешней функции требуется вызывать функцию член через экземпляр переданный справа). Для сложения числа с 3D_Point из его примера - требуется три раза вызвать. А для умножения матрицы 5x5 на число, - 25 раз. Может в этом и дело?
0
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
13.09.2012, 07:21  [ТС] #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...
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 10:37 #25
Цитата Сообщение от Jupiter Посмотреть сообщение
Цитата Сообщение от PSIAlt Посмотреть сообщение
возвращать const
это спорный вопрос
Бывают конечно ситуации, но вообще вопрос слабо спорный. operator+ равно как и другие математические операторы должны возврачать const - это если по-хорошему делать. См. Мейерса
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
13.09.2012, 12:56 #26
PSIAlt, Нет. Это спорный вопрос. Слишком спорный, чтобы советовать использовать возвращение констант.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
13.09.2012, 13:36 #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...
Это ж еще дольше. Ведь в конечном счёте, вектор и число, непосредственно, сложить или умножить нельзя. Всё равно, где-то придется распотрошить, до типов которые можно сложить. В итоги ещё и через промежуточный класс, обращаться. Это ж дольше?
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
13.09.2012, 13:52 #28
Цитата Сообщение от ForEveR Посмотреть сообщение
PSIAlt, Нет. Это спорный вопрос. Слишком спорный, чтобы советовать использовать возвращение констант.
Секундочку, речь идет только про operator+, operator* и аналогичные.
Интересно, зачем может понадобиться поменять результат сложения? Можно взять результат и использовать его для каких-то других вычислений, сохранить или еще что. Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Хотя, конечно если кто-то все еще пишет классы в которых operator+ делает что-то не имеющего ничего общего со сложенем, то да... Но надеюсь такие кодеры вымерли.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,673
Записей в блоге: 5
13.09.2012, 14:22 #29
Цитата Сообщение от PSIAlt Посмотреть сообщение
Секундочку, речь идет только про operator+, operator* и аналогичные.
Интересно, зачем может понадобиться поменять результат сложения? Можно взять результат и использовать его для каких-то других вычислений, сохранить или еще что. Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Хотя, конечно если кто-то все еще пишет классы в которых operator+ делает что-то не имеющего ничего общего со сложенем, то да... Но надеюсь такие кодеры вымерли.
PSIAlt, думаю речь о бинарных операторах вообще, а не только для + и * , например для - тоже. И как вычесть если не дистрибутивная операция? Надо же 10-a получить, а не а-10. Конечно можно объяснить юзеру, что Ваш класс это делает так: -(a-10), но зачем? А если у Вас перегружена операция > , то и < перегружать (?) или дать возможность сравнить большую матрицу с числом так: if(10>a). Пусть живут разные кодеры.
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
13.09.2012, 17:04 #30
Цитата Сообщение от PSIAlt Посмотреть сообщение
Никому же в голову не приходит что результат выражения 2+2 можно както менять?
Да, думаю, дело больше в том, что в Си++ есть такая штука как const-qualified методы. И если в результате сложения надо вернуть класс, который трогать нельзя, то придётся копировать результат сложения в переменную, чтобы вызывать его не-const метод, но который хоть фактически может быть const (то есть не изменять состояние объекта), но cv-правила дадут по рукам за попытку его вызвать. А взять и дописать ему const нельзя. Разве что снимать constness с помощью const_cast, что тоже не ахти.

Вместо того, чтобы сделать это в одной строке гораздо понятнее и без всяких извращений. Это не дело метода (тем более внешнего), что потом будут делать с возвращаемым им значением.
0
13.09.2012, 17:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2012, 17:04
Привет! Вот еще темы с ответами:

дружественные функции - C++
Имеется следующий код, содержащий дружественную функцию: mt.h #ifndef MT_H_ #define MT_H_ class Time { private: int...

Дружественные функции - C++
Создать класс «студент» (его фамилия, имя, год рождения и год поступления). Написать: а) член-функцию печати информации о студенте; ...

дружественные функции - C++
Тема: дружественные функции Напишите программу обращения слова. Помогите решить на С++

Дружественные функции - C++
Задание: создать дружественные функции . Вроде всё работает, но возможно я неправильно что то написала. Почему так часто вызывается...


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

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

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