ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн
Дружественные функции как мосты между классами
Представьте, что вам необходимо, чтобы функция работала с объектами двух
разных классов. Например, функция будет рассматривать объекты двух клас-
сов как аргументы и обрабатывать их скрытые данные. В такой ситуации ничто
не спасет, кроме friend-функции. Приведем простой пример FRIEND, дающий
представление о работе дружественных функций в качестве мостов между двумя
классами.
Листинг 11.9. Программа FRIEND
// friend.cpp
// Дружественные функции
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class beta; //нужно для объявления frifunc
class alpha
{
private:
int data;
public:
alpha() : data(3) { } //конструктор без
//аргументов
friend int frifunc(alpha, beta); //дружественная
//функция
};
///////////////////////////////////////////////////////////
class beta
{
private:
int data;
public:
beta() : data(7) { } //конструктор без
//аргументов
friend int frifunc(alpha, beta); //дружественная
//функция
};
///////////////////////////////////////////////////////////
int frifunc(alpha a, beta b) //определение функции
Листинг 11.9 (продолжение)
{
return( a.data + b.data );
}
//---------------------------------------------------------
int main()
{
alpha aa;
beta bb;
cout << frifunc(aa, bb) << endl; //вызов функции
return 0;
}
В этой программе мы видим два класса — alpha и beta. Конструкторы этих
классов задают их единственные элементы данных в виде фиксированных зна-
чений (3 и 7 соответственно).
Нам необходимо, чтобы функция frifunc() имела доступ и к тем, и к другим
скрытым данным, поэтому мы делаем ее дружественной функцией. Этой цели
в объявлениях внутри каждого класса служит ключевое слово friend:
friend int frifunc(alpha, beta);
Это объявление может быть расположено где угодно внутри класса. Нет ни-
какой разницы, запишем мы его в public- или в private-секцию.
Объект каждого класса передается как параметр функции frifunc(), и функ-
ция имеет доступ к скрытым данным обоих классов посредством этих аргумен-
тов. Функция выполняет не очень сложную работу по складыванию значений
данных и выдаче их суммы. В main() осуществляется вызов этой функции и вы-
водится на экран результат.
Напоминаем, что к классу нельзя обращаться до того, как он объявлен в про-
грамме. Объявление функции frifunc() (класс alpha) ссылается на класс beta, а зна-
чит, beta должен быть объявлен до alpha. Отсюда определение
class beta;
в начале программы.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
