Лабораторный практикум по основам языка C/С++ |
Тема 7.2. Дружественные функции
Инкапсуляция, как принцип объектно-ориентированного программирования, требует, чтобы компонентные данные (поля класса) были недоступны для прямого изменения в функциях, которые не являются частью класса.
В некоторых случаях все-таки возникает необходимость предоставить сторонней функции доступ к полям класса для выполнения некоторых специфических операций. В этом случае функцию необходимо объявить в классе со служебным словом friend
. Объявляя функцию таким способом вы даете ей такие же привелегии, что методам класса.
Чаще всего такие функции создаются для выполнения специальных операций над объектами двух разных классов. Более подробно об этом будет сказано в следующих темах данной лабораторной работы, при описании перегрузки различных операторов для классов. А сейчас рассмотрим простой пример использования дружественных функций.
Пусть требуется создать некоторое двумерное поле, по которому перемещается несколько объектов. Возникает задача обнаружения столкновения объектов со стенками поля. Не всегда можно ясно определить в каком классе следует реализовывать метод обнаружения столкновения со стенкой. Ниже она реализоввана в виде дружественной функции к классу TBody
Результат выполнения показан на последнем рисунке. Красным отмечены точки, в которых у объект меняется знак соответствующей компоненыт скорости.
Определение класса TField
Определение класса TBody
Функция, дружественная к классу TBody
Текст основной функции приложения
Результат работы программы