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

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

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

C++ Дружественные функции
Дружественные функции C++
Протестировать функции заданий 13 и 14 на наличие в них операторов возврата как с выражением ,так и без него C++
C++ дружественные функции
C++ Дружественные функции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
I.M.
 Аватар для I.M.
564 / 547 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
12.09.2012, 22:27     дружественные функции в C++. Когда без них невозможно? #2
Например, с помощью friend перегружают оператор ввода/вывода в поток
пример - www.cyberforum.ru/cpp/thread97114.html
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 22:35     дружественные функции в C++. Когда без них невозможно? #3
Например когда ты хочешь перегрузить какой-нибудь оператор, но слева стоит один из стандартных классов, например std::istream. Т.к. первый ты не можешь изменить, а из твоего operator<< вызываться не будет. В таких случаях нужна свободная функция operator<<. Дальше, если ты хочешь чтобы она к примеру работала быстрее - возможно есть смысл ослабить для нее энкапсуляцию и позволить лазить в приватные части и складывать данные.
romex
 Аватар для romex
44 / 44 / 4
Регистрация: 11.04.2010
Сообщений: 223
12.09.2012, 22:40     дружественные функции в C++. Когда без них невозможно? #4
Дружественные функции - всего лишь одна из возможностей C++. Можете ими не пользоваться, но они часто делают код изящнее.
Alberto_Timakov
1 / 1 / 0
Регистрация: 21.11.2011
Сообщений: 183
12.09.2012, 22:45  [ТС]     дружественные функции в C++. Когда без них невозможно? #5
Цитата Сообщение от I.M. Посмотреть сообщение
Например, с помощью friend перегружают оператор ввода/вывода в поток
пример
В перегрузке <<,>> можно обойтись и обычной функцией, а обращение к скрытым полям в ней сделать посредством методов класса

Добавлено через 1 минуту
Цитата Сообщение от PSIAlt Посмотреть сообщение
Например когда ты хочешь перегрузить какой-нибудь оператор, но слева стоит один из стандартных классов, например std::istream. Т.к. первый ты не можешь изменить, а из твоего operator<< вызываться не будет. В таких случаях нужна свободная функция operator<<. Дальше, если ты хочешь чтобы она к примеру работала быстрее - возможно есть смысл ослабить для нее энкапсуляцию и позволить лазить в приватные части и складывать данные.
Цитата Сообщение от romex Посмотреть сообщение
Дружественные функции - всего лишь одна из возможностей C++. Можете ими не пользоваться, но они часто делают код изящнее.
Ок. Т.е. критичной необходимости в них нет?
romex
 Аватар для romex
44 / 44 / 4
Регистрация: 11.04.2010
Сообщений: 223
12.09.2012, 22:48     дружественные функции в C++. Когда без них невозможно? #6
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
Ок. Т.е. критичной необходимости в них нет?
Критичной необходимости нет и для, например, исключений, но это удобно.
В перегрузке <<,>> можно обойтись и обычной функцией, а обращение к скрытым полям в ней сделать посредством методов класса
Это часто бывает костылем.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 22:58     дружественные функции в C++. Когда без них невозможно? #7
Цитата Сообщение от Alberto_Timakov Посмотреть сообщение
В перегрузке <<,>> можно обойтись и обычной функцией, а обращение к скрытым полям в ней сделать посредством методов класса
Это открывает те самые методы для всей программы вообще.

Конечно, можно обойтись и без того, и без другого. Раньше люди и на чистом С писали, в том числе классы реализовывали...
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
12.09.2012, 23:08     дружественные функции в C++. Когда без них невозможно? #8
А как реализовать operator+, если он например складывает два объекта одного класса?

Запихать в класс будет неправильным - это не есть часть класса, это некая фукнция которая производит операции над двумя обхектами этого класса и возращает третий такой.
romex
 Аватар для romex
44 / 44 / 4
Регистрация: 11.04.2010
Сообщений: 223
12.09.2012, 23:12     дружественные функции в C++. Когда без них невозможно? #9
Цитата Сообщение от _stealth_ Посмотреть сообщение
А как реализовать operator+, если он например складывает два объекта одного класса?

Запихать в класс будет неправильным - это не есть часть класса, это некая фукнция которая производит операции над двумя обхектами этого класса и возращает третий такой.
В std::string сделано именно так.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 23:14     дружественные функции в C++. Когда без них невозможно? #10
Цитата Сообщение от _stealth_ Посмотреть сообщение
А как реализовать operator+, если он например складывает два объекта одного класса?

Запихать в класс будет неправильным - это не есть часть класса, это некая фукнция которая производит операции над двумя обхектами этого класса и возращает третий такой.
Запихать внутрь какраз самое то. Даже неявное преобразование помогает(если конструктор не explicit), например:
C++
1
2
std::string str("Hello");
str = str + " world!";
Другое дело когда наоборот, то есть
C++
1
"Hello" + std::string("world!");
-- в таком случае придется делать внешнюю функцию
C++
1
std::string operator+(std::string s1, std::string s2);
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
12.09.2012, 23:20     дружественные функции в C++. Когда без них невозможно? #11
Цитата Сообщение от romex Посмотреть сообщение
В std::string сделано именно так.
Да, и Страуступ этого не коменнтирует
Но, на сколько я его понял, нужно сделать пространство имен, в нем класси о дружественные функции, как операторы (11.5 и 11.5.2 у Страуступа). Думаю это логично.
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.09.2012, 23:20     дружественные функции в C++. Когда без них невозможно? #12
Цитата Сообщение от PSIAlt Посмотреть сообщение
Это открывает те самые методы для всей программы вообще.
Вполне можно сделать только два метода: serialize() и deserialize(), такие себе мега-get() и мега-set(). И operator<<() с operator>>() внешними функциями пишутся безо всяких друзей.
Герц
523 / 340 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
12.09.2012, 23:21     дружественные функции в C++. Когда без них невозможно? #13
Вместо доступа дружественной функции к нутру класса всегда можно сделать геттер и сеттер.
Я почти уверен, что компилятор как-нибудь оптимизирует код, что ты не заметишь разницы между получением доступа по геттеру или через прямой доступ (.).
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 23:24     дружественные функции в C++. Когда без них невозможно? #14
Цитата Сообщение от Герц Посмотреть сообщение
Я почти уверен, что компилятор как-нибудь оптимизирует код, что ты не заметишь разницы между получением доступа по геттеру или через прямой доступ (.).
Почти уверен что ребзя из других отделов придумают как бы это посмешнее использовать=)
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
12.09.2012, 23:24     дружественные функции в C++. Когда без них невозможно? #15
Цитата Сообщение от PSIAlt Посмотреть сообщение
Запихать внутрь какраз самое то. Даже неявное преобразование помогает(если конструктор не explicit), например:
C++
1
2
std::string str("Hello");
str = str + " world!";
Другое дело когда наоборот, то есть
C++
1
"Hello" + std::string("world!");
-- в таком случае придется делать внешнюю функцию
C++
1
std::string operator+(std::string s1, std::string s2);
Ну, а разве в первом случаи внешний опрератор не справится? Этот код расшифруеся
C++
1
2
3
some = str + " word";
some = str + std::string(" word");
some = operator+(str, std::string(" word"));
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 23:28     дружественные функции в C++. Когда без них невозможно? #16
Справится, спору нет=) Но ведь не всегда есть нужда)
romex
 Аватар для romex
44 / 44 / 4
Регистрация: 11.04.2010
Сообщений: 223
12.09.2012, 23:30     дружественные функции в C++. Когда без них невозможно? #17
Цитата Сообщение от _stealth_ Посмотреть сообщение
Но, на сколько я его понял, нужно сделать пространство имен, в нем класси о дружественные функции, как операторы (11.5 и 11.5.2 у Страуступа). Думаю это логично.
Си++ довольно гибкий язык, не обязательно делать все по одному шаблону.
PSIAlt
 Аватар для PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
12.09.2012, 23:32     дружественные функции в C++. Когда без них невозможно? #18
Насчет пространства имен - это связано с порядком поиска перегруженных операторов, см. Мейерса кому интересно
_stealth_
16 / 16 / 1
Регистрация: 07.06.2012
Сообщений: 100
12.09.2012, 23:37     дружественные функции в C++. Когда без них невозможно? #19
Цитата Сообщение от PSIAlt Посмотреть сообщение
Справится, спору нет=) Но ведь не всегда есть нужда)
Да, тут конечно удобство в приоритете
Я к тому, что чтобы сохранить логику, нужно иногда использовать friend, а без них ни как.

Время поиска - это на время компиляции влиеят в смысле?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2012, 01:10     дружественные функции в C++. Когда без них невозможно?
Еще ссылки по теме:

Дружественные функции C++
C++ Дружественные функции
C++ Дружественные функции. Наследование. Перегрузка функции

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

Или воспользуйтесь поиском по форуму:
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
13.09.2012, 01:10     дружественные функции в C++. Когда без них невозможно? #20
Цитата Сообщение от PSIAlt Посмотреть сообщение
Цитата Сообщение от _stealth_ Посмотреть сообщение
А как реализовать operator+, если он например складывает два объекта одного класса?
Запихать в класс будет неправильным - это не есть часть класса, это некая фукнция которая производит операции над двумя обхектами этого класса и возращает третий такой.
Запихать внутрь какраз самое то.
не то, ибо operator+ не должен модифицировать сам объект для которого предполагается вызов
Yandex
Объявления
13.09.2012, 01:10     дружественные функции в C++. Когда без них невозможно?
Ответ Создать тему
Опции темы

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