Друзья класса

Друзья классов - последнее, о чем я собираюсь рассказать на этом занятии.

При разработке программ случается, что одних функций-членов для доступа к личным полям не хватает. Это не обязательно признак просчета при разработке классов, просто некоторые проблемы невозможно решить с помощью функций-членов. Например, что делать, если функции требуется полный доступ к полям двух классов? Для того, чтобы в подобных случаях не приходилось делать поля публичными, С++ позволяет классу объявлять друзей (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 вопрос


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: