Когда разумно использовать дружбу в ООП? - PullRequest
4 голосов
/ 15 декабря 2008

Я в настоящее время изучаю учебник http://www.cplusplus.com, и я наткнулся на этот раздел здесь: http://www.cplusplus.com/doc/tutorial/inheritance.html, посвященный теме функций друга и друга занятия на С ++.

У меня такой вопрос, когда когда разумно использовать дружбу при создании программы?

Единственная подсказка, которую я получил, была в примере внутри статьи, который демонстрировал функцию друга, которая «дублировала» объект.

Ответы [ 5 ]

5 голосов
/ 15 декабря 2008

Для этого есть несколько хороших практических правил в C ++ FAQ Lite .

Маршалла Клайна.

Все хорошо, но, в частности, см. «Нарушают ли друзья инкапсуляцию?» , где приведены примеры правильного способа их использования, а также, когда лучше разделить классы и объявить их друзьями.

4 голосов
/ 15 декабря 2008

Функции Friend существуют для представления свободных функций как непрерывной части интерфейса класса. Есть несколько мест, где свободные функции являются частью интерфейса класса. Пример. Предположим, у вас есть класс произвольной точности BigNum. Вот несколько очевидных кандидатов на функции друзей:

// binary operators where BigNum isn't the left-hand operand
BigNum operator+ (int, BigNum);
BigNum operator- (int, BigNum);

// stream operators
std::ostream &operator<< (std::ostream &os, const BigNum &num);
std::istream &operator>> (std::istream &is, BigNum &num);

Теперь, учитывая эти два примера, во многих случаях бинарные операторы не должны быть друзьями (например, я могу реализовать int + BigNum, делегировав BigNum + int, который является функцией-членом и, таким образом, уже имеет полный доступ) , Но все зависит от ваших потребностей в производительности и от того, что вы хотите продемонстрировать через общедоступные функции класса.

3 голосов
/ 15 декабря 2008

Одно хорошее приложение для занятий с друзьями - это шаблон Memento .

0 голосов
/ 15 декабря 2008

Я использовал только дружественные методы и свойства для использования внутри самого класса для клонирования самого себя или назначения другого объекта себе. Это было в значительной степени заменено, мы реорганизовали дизайн, чтобы внедрить шаблон Memento Design в наш дизайн.

Memento создается теми же механизмами, которые используются для сохранения и загрузки объекта. то есть Memento создает поток, объект записывает в него, и Memento может быть передан любому другому объекту того же класса, чтобы сделать его точной копией объекта, создающего Memento.

Иногда бывают случаи, когда объекты должны работать очень близко друг к другу, и в этом случае я упрощаю их взаимодействие, объединяя их за другим объектом. Переменные, которые будут «дружественными» переменными и видимы только для других объектов, являются частными для класса, выполняющего агрегирование.

0 голосов
/ 15 декабря 2008

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

Примером, когда вы не можете обойтись без друзей, является переопределение потоковых операторов << и >>. Также в реализации некоторых шаблонов проектирования часто используются дружественные классы - на ум приходит «Итератор».

...