Дружні функції як мости між класами

Нехай нам необхідно, щоб функція працювала з об’єктами двох різних класів. Напприклад, функція буде розглядати об’єкти двох класів як аргументи і оброблятиме їх приховані дані. В програмі 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; просмотров: 698;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.