Дружні функції як мости між класами
Нехай нам необхідно, щоб функція працювала з об’єктами двох різних класів. Напприклад, функція буде розглядати об’єкти двох класів як аргументи і оброблятиме їх приховані дані. В програмі 22.8 приведено простий приклад FRIEND, що дає уявлення про роботу дружніх функцій в якості мостів між двома класами.
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<bios.h>
class beta;
/////////////
class alpha
{private:
int data;
public:
alpha():data(3) { } // конструктор без аргументів
friend int frifunc(alpha,beta);
};
////////////
class beta
{private:
int data;
public:
beta():data(5) { } //конструктор без аргументів
friend int frifunc(alpha,beta);
};
////////////
int frifunc(alpha a,beta b)
{
return a.data+b.data;
}
///////////
int main()
{clrscr();
alpha aa;
beta bb;
cout<<frifunc(aa,bb)<<endl;
bioskey(0);
return 0;
}
Програма 22.8
В цій програмі ми бачимо два класи – alpha і beta. Конструктори цих класів задають їх єдині елементи даних у вигляді фіксованих значень 3 і 5. Нам необхідно, щоб функція frifunc() мала доступ до тих та інших прихованих даних, тому ми робимо її дружньою функцією. З цією метою всередині кожного класу використане ключове слово friend.
friend int frifunc(alpha,beta);
Це оголошення може бути розміщене де завгодно всередині класу. Немає жодної різниці, запишемо ми його в public- чи private-секцію.
Об’єкт кожного класу передається як параметр функції frifunc(), і функція має доступ до прихованих даних обох класів через ці аргументи. Функція додає значення даних і повертає їх суму.
Нагадаємо, що до класу не можна звертатися до того, як він оголошений в програмі. Оголошення функції frifunc() в класі alpha посилається на клас beta, а, отже, beta повинен бути оголошений до alpha. Звідси означення
class beta;
на початку програми.
Треба відмітити, що ідея дружніх функцій дещо сумнівна. Під час розробки С++ на цю тему велися суперечки і приводилися аргументи проти включення в мову такої можливості. З одного боку, дружні функції підвищують гнучкість мови, з іншого - вони не відповідають принципу обмеження доступу до даних, згідно з яким тільки функції-члени можуть мати доступ до прихованих даних класу.
Наскільки серйозно суперечить єдності концепції використання дружніх функцій? Дружня функція оголошується такою в тому класі, до даних якого вона пізніше й матиме доступ. Таким чином, програміст, що не має доступу до вихідного коду класу, не може зробити функцію дружньою. В цьому сенсі цілісність даних зберігається. Але все одно такі функції можуть призвести до «spaghetti code» (код з надто великою кількістю передач управління), коли численні дружні функції фактично стирають границі між класами. З цієї причини дружні функції повинні бути принаймні розкидані по програмі і зустрічатися як можна рідше.
Дата добавления: 2015-08-26; просмотров: 705;