Дружні функції, програмування на c і ​​c

Функція, яка не є членом класу, може мати доступ до його приватним членам в разі, якщо вона оголошена одним (friend) класу. Наприклад, в наступному прикладі функція frd () оголошена друга класу cl:

class line;
class box int color; // колір прямокутника
int upx, upy; // лівий верхній кут
int lowx, lowy; // правий нижній кут
public:
friend int same_color (line l, box b);
void set_color (int c);
void define_box (int x1, int y1, int x2, int y2);
void show_box ();
>;
class line int color;
int startx, starty;
int len;
public:
friend int same_color (line I, box b);
void set_color (int c);
void define_line (int x, int y, int I);
void show_line ();
>;

Функція same_color () не є членом жодного з класів, але є одним обох. Вона повертає істину, якщо об'єкт типу line і об'єкт типу box намальовані одним і тим же кольором, і значення 0 - в іншому випадку. Наступний код визначає функцію same_color ():

// повертає істину, якщо лінія і прямокутник мають однаковий колір
int same_color (line I, box b)
if (l.color == b.color) return 1;
return 0;
>

Як можна бачити, функція same_color () повинна мати доступ до приватних частинах обох класів line і box. Оскільки вона є одним кожного з класів, то вона має право такого дост-па. Більш того, звернемо увагу, що оскільки функція same_color () не є членом, то для її використання немає необхідності в операторі області видимості або в використанні імені класу. Звернемо увагу, що для тих же цілей можна було створити функцію-член зі специфікатором доступу public, яка повертала б кольору об'єктів типу line і box, а також ще одну функцію для порівняння цих квітів. Однак такий підхід зажадав б додаткових-них викликів функцій, що в деяких випадках неефективно.

Наступна програма демонструє класи line і box і показує, як дружня фун-кція може отримувати доступ до приватних членів класу.

#include
#include
class line;
class box int color; // колір прямокутника
int upx, upy; // верхній лівий кут
int lowx, lowy; // правий нижній кут
public:
friend int same_color (line l, box b);
void set_color (int c);
void define_box (int x1, int y1, int x2, int y2);
void show_box ();
>;
class line int color;
int startx, starty;
int len;
public:
friend int same_color (line I, box b);
void set_color (int c);
void define_line (int x, int y, int I);
void show_line ();
>;
// повертає істину, якщо лінія і прямокутник мають однаковий колір
int same_color (line I, box b)
if (l.color == b.color) return 1;
return 0;
>
void box :: set_color (int c)
color = c;
>
void line :: set_color (int c)
color = c;
>
void box :: define_box (int x1, int y1, int x2, int y2)
upx = x1;
upy = y1;
lowx = x2;
lowy = y2;
>
void box :: show_box ()
int i;
textcolor (color);
gotoxy (upx, upy);
for (i = upx; i<=lowx; i++) cprintf("-");
gotoxy (upx, lowy-1);
for (i = upx; i<=lowx; i++) cprintf("-");
gotoxy (upx, upy);
for (i = upy; i<=lowy; i++) cprintf (" | ");
gotoxy (upx. i);
>
gotoxy (lowx, upy);
for (i = upy; i<=lowy; i++) cprintf ("I");
gotoxy (lowx, i);
>
>
void line :: define_line (int x, int y, int I)
startx = x;
starty = y;
len = I;
>
void line :: show_line ()
int i;
textcolor (color);
gotoxy (startx, starty);
for (i = 0; i>
int main ()
box b;
line I;
b.define_box (10, 10, 15, 15);
b.set_color (3);
b.show_box ();
l.define_line (2, 2, 10);
l.set_color (2);
l.show_line ();
if (! same_color (I, b)) cout <<"Not the same.\n";
cout <<"\nPress a key.";
getch ();
// тепер робимо лінію і прямокутник одного кольору
l.define_line (2, 2, 10);
l.set_color (3);
I.show_line ();
if (same_color (l, b)) cout <<"Are the same color.\n";
return 0;
>

Є два важливих обмеження стосовно дружнім функціям. Перше полягає в тому, що похідні класи не успадковують дружніх функцій. Друге полягає в тому, що дружні функції не можуть оголошуватися з ключовими словами static або extern.

Схожі статті