Шаг 14.
Пример использования дружественных функций

    На этом шаге мы приведем пример использования дружественных функций.

    Использование механизма дружественных функций позволяет упростить интерфейс между классами. Например, дружественная функция позволит получить доступ к собственным или защищенным компонентам сразу нескольких классов. Тем самым из классов можно иногда убрать компонентные функции, предназначенные только для доступа к этим "скрытым" компонентам.

    В качестве примера рассмотрим дружественную функцию двух классов "точка на плоскости" и "прямая на плоскости". Класс "точка на плоскости" включает компонентные данные для задания координат (х, у) точки. Компонентными данными класса "прямая на плоскости" будут коэффициенты A, B, C общего уравнения прямой A*х+B*y+C = 0. Дружественная функция определяет уклонение заданной точки от заданной прямой. Если (a, b) - координаты конкретной точки, то для прямой, в уравнение которой входят коэффициенты A, B, C, уклонение вычисляется как значение выражения A*a+B*b+C. В следующей программе определены классы с общей дружественной функцией, в основной программе введены объекты этих классов и вычислено уклонение от точки до прямой:

//OOP14_1.СРР -  классы с общей дружественной функцией. 
#include <iostream.h>
class  line2;	// Предварительное  описание.
// Класс  "точка на плоскости":
class point2
{ float x, y;      // Координаты точки на плоскости.
  public:
	point2(float xn = 0, float yn = 0) // Конструктор.
	  { x = xn; y = yn; }
	friend float uclon(point2,line2);
};
// Класс "прямая на плоскости":
class line2
{ float A, B, C;  // Параметры прямой.
  public:
	 line2(float a, float b, float c) // Конструктор.
		{ A = a; B = b; C = c; }
	 friend float uclon(point2,line2);
};
// Внешнее определение дружественной функции.
float uclon(point2 p, line2 l)
  { return l.A * p.x + l.B * p.y + l.C; }
void main(void)
{ point2 P(16.0,12.3);	// Определение точки P.
  line2 L(10.0,-42.3,24.0);     // Определение прямой L.
  cout << "\n Уклонение точки Р от прямой L: ";
  cout << uclon(P,L);
}
Текст этой программы можно взять здесь.

    Результат выполнения программы:

    Уклонение  точки  Р  от прямой L:   -336.29


В качестве упражнения можно вместо дружественной функции uclon() определить глобальную функцию с теми же параметрами. При этом в классы point2 и line2 придется ввести дополнительные компонентные функции для доступа к собственным данным. Решение этой задачи можно посмотреть здесь.

    На следующем шаге мы продолжим знакомство с друзьями классов, в частности, рассмотрим дружественные классы.




Предыдущий шаг Содержание Следующий шаг