Функции друзей - PullRequest
       51

Функции друзей

1 голос
/ 29 июня 2011

Просто простой вопрос об использовании дружественных функций, точнее их полезности.В основном ..

Чем они полезны?Если вы правильно спроектировали свои классы, действительно ли вам понадобятся функции друзей?В каких случаях вы хотели бы использовать их или не использовать?Мне сказали, что они улучшают инкапсуляцию, но из моего опыта я использовал только одну функцию друга за 7 лет, которые я кодировал.После дальнейшего изучения и рефакторинга моего кода я понял, что мне даже не нужно его использовать.Кажется, что они несколько нарушают инкапсуляцию, а не улучшают ее.Это, вероятно, из-за моего отсутствия знаний в этой области.

тлдр;Что такого полезного в функциях друзей, когда их следует или не следует использовать, и как они улучшают инкапсуляцию?

Ответы [ 3 ]

1 голос
/ 29 июня 2011

Кто бы ни сказал вам, что функции ваших друзей улучшают инкапсуляцию, он совершенно неправ, он полная противоположность. Им действительно нет места в настоящем ООП-мире.

Однако жизнь редко бывает идеальной, и иногда вам нужно вызывать защищенные методы из других классов в вашей среде, не подвергая их внешним воздействиям. C # и Java решили эту проблему очень элегантно: у них есть модификатор internal (с немного другими значениями), но в C ++ все, что у вас есть, это friend.

Если вы действительно программировали в течение 7 лет, не нуждаясь в этой конструкции, то вы либо создаете каждый метод и переменную в своем классе public, либо вообще не используете классы.

1 голос
/ 29 июня 2011

Один из сценариев, о которых я могу подумать, - это когда несколько проектов совместно используют код.Ваш класс B должен иметь доступ к закрытым членам класса A, который принадлежит отдельной группе.Если вы не можете разорвать существующий контракт этого класса, вы можете добавить метод друга, который делает то, что вам нужно, не нарушая ничего для другой группы.

Конечно, теперь с .NET 4 мы можем добавитьдинамические методы для классов, что полностью исключает мой сценарий.

0 голосов
/ 29 июня 2011

Пожалуйста, смотрите - http://en.wikipedia.org/wiki/Friend_function

...