Microsoft Visual C++ и MFC. Программирование для Windows 95 и Windows NT | страница 15



Дружественная функция не является элементом класса, но может обращаться ко всем его элементам, включая private и protect. Одна и та же функция может быть дружественной для двух или более классов.

В следующем примере определена функция Clear, дружественная для класса point. Дружественная функция Clear используется для изменения значения элементов данных m_x и m_y, объявленных как private:

>//==========================================================

>// Класс point

>class point {

>public:

>// Функция Clear объявляется дружественной классу point

> friend void point::Clear(point*);


> // Интерфейс класса…

> private:

> int m_x;

> int m_y;

>};


>//==========================================================

>// Функция Clear

>void Clear(point* ptrPoint) {

> // Обращаемся к элементам класса, объявленным как private

> ptrPoint->m_x = 0;

> ptrPoint->m_y = 0;

> return;

>}


>//==========================================================

>// Главная функция

>void main() {

> point pointTestPoint;


> // Вызываем дружественную функцию

> Clear(&pointTestPoint);

>}

С помощью ключевого слова friend вы можете объявить некоторые методы одного класса дружественными для другого класса. Такие методы могут обращаться ко всем элементам класса, даже объявленным как private и protect, несмотря на то, что сами они входят в другой класс.

В следующем примере мы определяем два класса – line и point. В классе point определяем метод Set и объявляем его в классе line как дружественный. Дружественный метод Set может обращаться ко всем элементам класса line:

>// Предварительное объявление класса line

>class line;


>//==========================================================

>// Класс point

>class point {

>public:

> // Метод Set класса point

> void Set(line*);


> // …

>};


>//==========================================================

>// Класс line

>class line {

>public:

> // Метод Set класса point объявляется дружественной

> // классу point

> friend void point::Set(line*);


>private:

> int begin_x, begin_y;

> int end_x, end_y;

>};


>//==========================================================

>// Функция Clear

>void point::Set(line* ptrLine) {

> // Обращаемся к элементам класса line, объявленным как

> // private

> ptrLine->begin_x = 0;

> ptrLine->begin_y = 0;

> // …


> return;

>}


>//==========================================================

>// Главная функция

>void main() {

> point pointTestPoint;

> line lineTestPoint;


>// Вызываем дружественный метод

> pointTestPoint.Set(&lineTestPoint);

>}

Дружественные классы

По аналогии с дружественными функциями и методами, можно объявить дружественный класс. Все методы дружественного класса, могут обращаться ко всем элементам класса, включая элементы, объявленные как private и protect.