Microsoft Visual C++ и MFC. Программирование для Win95 и WinNT

         

Дружественные функции


В Си++ вы можете определить для класса так называемую дружественную функцию, воспользовавшись ключевым словом friend. В классе содержится только объявление дружественной функции. Ее определение расположено вне класса. Вы можете объявить дружественную функцию в любой секции класса - public, private или protect.

Дружественная функция не является элементом класса, но может обращаться ко всем его элементам, включая 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);

}


Содержание раздела