Друзья классов - последнее, о чем я собираюсь рассказать на этом занятии.
При разработке программ случается, что одних функций-членов для доступа к личным полям не хватает. Это не обязательно признак просчета при разработке классов, просто некоторые проблемы невозможно решить с помощью функций-членов. Например, что делать, если функции требуется полный доступ к полям двух классов? Для того, чтобы в подобных случаях не приходилось делать поля публичными, С++ позволяет классу объявлять друзей (friends) - функции и классы, у которых есть полный доступ к начинке класса (такой же доступ, как у его собственных функций). Делается это с помощью ключевого слова friend. В приведенном ниже примере в классе A определяются friend-функция print_fields(A a) и friend-класс B.
// Forward declaration of class B;
class B;
// class A definition
class A {
int n1, n2;
friend void print_fields(A a);
friend class B;
public:
set_fields(n_1,n_2) {
n1 = n_1;
n2 = n_2;
}
};
void print_fields(A a) {
cout << a.n1 << " " << a.n2 << endl;
}
Функция print_fields(A a) имеет полный доступ к личным полям класса A, поскольку она объявлена friend-функцией класса. Заметьте - friend-объявление распространяется только на функцию с указанной сигнатурой, в нашем случае print_fields(A), а не на все функции с именем print_fields. Что касается объявления
|
|
friend class B;
то оно делает поля класса A доступными для всех функций-членов класса B.
Функции и классы-друзья незаменимы там, где разные типы данных тесно связаны между собой, но реализовывать их в одном классе невыгодно или просто невозможно. Хороший пример этому - С++-стиль ввода-вывода, в котором именно дружественные функции позволяют разрабатывать версии операторов << и >> для вновь создаваемых классов.
8 вопрос