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

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

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

   
В качестве примера рассмотрим дружественную функцию двух классов "точка на плоскости" и "прямая на плоскости".
Класс "точка на плоскости" включает компонентные данные для задания координат
(х, у) точки. Компонентными данными класса "прямая на плоскости" будут коэффициенты
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 придется ввести
дополнительные компонентные функции для доступа к собственным данным. Решение
этой задачи можно посмотреть здесь.

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий