Язык программирования C++. Вводный курс


Друзья - часть 3


Класс должен объявлять другом каждую из множества перегруженных функций, которой он хочет дать неограниченные права доступа:

extern ostream& storeOn( ostream &, Screen & );

extern BitMap& storeOn( BitMap &, Screen & );

// ...

 

class Screen

{

   friend ostream& storeOn( ostream &, Screen & );

   friend BitMap& storeOn( BitMap &, Screen & );

   // ...

};

Если функция манипулирует объектами двух разных классов и ей нужен доступ к их неоткрытым членам, то такую функцию можно либо объявить другом обоих классов, либо сделать членом одного и другом второго.

Объявление функции другом двух классов должно выглядеть так:

class Window;   // это всего лишь объявление

class Screen {

   friend bool is_equal( Screen &, Window & );

   // ...

};

 

class Window {

   friend bool is_equal( Screen &, Window & );

   // ...

};

Если же мы решили сделать функцию членом одного класса и другом второго, то объявления будут построены следующим образом:

class Window;

class Screen {

   // copy() - член класса Screen

   Screen& copy( Window & );

   // ...

};

 

class Window {

   // Screen::copy() - друг класса Window

   friend Screen& Screen::copy( Window & );

   // ...

};

 

Screen& Screen::copy( Window & ) { /* ... */ }

Функция-член одного класса не может быть объявлена другом второго, пока компилятор не увидел определения ее собственного класса. Это не всегда возможно. Предположим, что Screen

должен объявить некоторые функции-члены Window своими друзьями, а Window – объявить таким же образом некоторые функции-члена Screen. В таком случае весь класс Window объявляется другом Screen:

class Window;

class Screen {

   friend class Window;

   // ...

};

К закрытым членам класса Screen

теперь можно обращаться из любой функции-члена Window.

Упражнение 15.6

Реализуйте операторы ввода и вывода, определенные для класса Screen в упражнении 15.5, в виде друзей и модифицируйте их определения так, чтобы они напрямую обращались к закрытым членам. Какая реализация лучше? Объясните почему.




Начало  Назад  Вперед



Книжный магазин