|
Программирование >> Программирование на языке c++
компонентам разных классов (к компонентам с атрибутом private). Рассмотрим пример. Пусть заданы два графических объекта: circle (окружность) и rectangle (прямоугольник). Некоторая функция (назовем ее equal colour) должна сравнивать цвета этих объектов и возвращать результат, говорящие! о совпадении или несовпадении цветов (рис. 3.4). Цвет окружности и прямоугольника задается локальным компонентом соответствующих объектов (назовем их circle colour и rectangle colour). Другими словами, цвет окружности задается компонентом-данным с именем circle colour, имеющим атрибут private и заданным в объекте circle. Цвет же прямоугольника задается компонентом-данным с именем rectangle colour, имеющим атрибут private и заданным в объекте rectangle. В этом случае наша функция equal colour должна иметь доступ к локальным компонентам разных объектов. В этом случае она должна быть компонентом-функцией одновременно объекта circle и объекта rectangle, но, согласно правилам языка С++, это невозможно. Конечно, можно найти какой-то способ решения данной задачи, однако основная идея хорошего языка программирования заключается в том, чтобы предоставить пользователю этого языка естественные, простые и удобные средства для решения различных практических задач. Другими словами, задача должна решаться очевидными методами, а не путем изобретения изощренных приемов. Объект класса окружность Объект класса прямоугольник private: (локальный) circle colour (цвет окружности) private: (локальный) rectangle colour (цвет прямоугольника) Рис. 3.4. Для получения доступа к локальным компонентам объектов разных классов функция equal colour должна бытьобъявлена со спецификатором friend void equal colour (circle c, rectangle r) { if(c.colour == r.colour) return true; else return false; В целом функции со спецификатором friend являются обычными глобальными функциями (конечно, если они не объявлены в другом классе), какими являются функции языка С или функции, объявленные и описанные за пределами классов в языке С++. Единственное их отличие заключается в том, что они имеют право доступа к локальным компонентам класса. Поскольку функции со спецификатором friend не являются компонентами класса, то они не имеют и не могут использовать указатель this. Объявление функции со спецификатором friend в пределах класса X является действительно объявлением. Оно вводит имя функции в границы класса X. Это объявление можно поместить в любую секцию класса (public, private или protected). В любом случае friend функция является глобальной и неважно, в какой секции она объявлена. Поскольку friend функции объявляются в классе X, то они могут рассматриваться как часть интерфейса класса X, другими словами, как часть функций класса X, осуществляющих взаимодействие с внещней средой. В язык С++ введен спецификатор friend. Если некоторая функция определена как friend функция для некоторого класса X, то: -♦ она не является компонентом-функцией этого класса; -♦ она имеет доступ ко всем компонентам этого класса (т. е. к компонентам с атрибутами private, public и protected). Некоторая функция является friend функцией, если она объявлена со спецификатором friend, например: class circle { int colour, x,y,radius; public: friend int equal colour(circle c, rectangle r); Компонент-функция одного класса может быть объявлена со спецификатором friend для другого класса, например: class X { int function of X(. i .); class Y { friend int X:: function of X(. . .); в этом случае function of X имеет доступ к локальным компонентам класса Y. В примере было использовано полное имя функции, представленное в виде: X:: function of X(. . .). Запись вида X:: function of X(. . .) говорит о том, что function of X(. . .) принадлежит классу X. Другими словами, это компонент-функция. Спецификатор friend разрешает этой функции иметь доступ к локальным компонентам класса Y. Почему класса Y? Потому, что функция function of X(. . .) объявлена в этом классе со спецификатором friend. Все функции одного класса можно объявить со спецификатором friend по отношению к другому классу. Для этого разрешается использовать следующую сокращенную запись: class X { friend class Y; В этом случае все компоненты-функции класса У имеют спецификатор friend для класса X, т. е. все они имеют доступ к локальным компонентам класса X. Рассмотрим примеры. Первая программа показывает, как можно сравнить компоненты объектов разных классов, имеющие атрибут private. #include <iostreanfi.h> class my class2; это неполное объявление class my class1 { int a; friend void fun(my class1&,nfiy class2&); public:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |