Главная->Інформатика та програмування->Содержание->Дружественные функции как мосты между классами

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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;

в начале программы.

 

13