Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

Void ShowValue(void)

{cout<<anobject.value;}};

Поле value об'єкта anobject типу Aclass закрите в класі Bclass. Тому в наведеному прикладі у функції ShowValue виникне помилка. Уникнути її можна, якщо оголосити клас Bclass другом класу Aclass, використавши ключове слово friend:

class Aclass{

friend class Bclass;

private:

double value;

public:

Aclass(){value=3.14159;}};

Оголошення дружнього класу може міститись будь-де у протоколі опису класу (не обов'язково на початку формального опису після "{")). При оголошенні дружніх класів потрібно дотримуватись певних правил:

1. У класі мають бути перелічені всі його друзі.

2. Клас, у якому є закриті й захищені члени та дружній інший клас, надає можливість другу мати доступ до своєї закритої частини (за протоколом). Клас не може оголосити сам себе другом іншого класу.

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

4. Похідні від дружніх класів не є дружніми.

5. Синтаксично похідний клас може бути другом іншого. Результат – аналогічний.

Розглянемо приклад:

class One{

friend class Two;

private:

int x;

protected:

void doublex(void){x*=x;}

public:

One(){x=100;}

One(int n){x=n;}

};

class Two{

private:

One oneobject;

public:

Void ShowValues(void);};

Void Two::ShowValues(void)

{

cout<<"\n before oneobject.x="<<oneobject.x;

aone.doublex();

cout<<"\n after oneobject.x="<<oneobject.x<<"\n";;

}

main()

{Two twoobject;

twoobject.ShowValues();

return 0;}

Як бачимо, функція ShowValues класу Two має доступ до поля x об'єкта oneobject і функції doublex(), незважаючи на те, що вони є закритими членами класу One.

7.11.2. Дружні функції

Крім дружніх класів, у С++ існують дружні функції. Синтаксично для оголошення дружньої до класу функції необхідно в протоколі класу помістити оголошення вигляду

friend<тип результату><ім’я функції>(сигнатура);

Зазвичай таке оголошення розміщують одразу після відкриваючої фігурної дужки у протоколі класу. Оголошення функції другом класу відкриває їй доступ до закритих і захищених даних екземпляра класу. Дружні функції можуть бути як звичайними функціями С++, так і членами класу. Зазвичай дружня функція оголошується з параметрами-класами, з якими вона дружить. Розглянемо приклад:

#include <iostream.h>

class Two;

class One{

friend void Show(One &c1,Two &c2);

private:

char*s1;

public:

One(){s1="testing";};

class Two{

friend void Show (One &c1,Two &c2);

private:

char*s2;

public:

Two(){s2="one,two,three";};

main()

{One c1;

Two c2;

Show(c1,c2);

return 0;}

Void Show(One &c1,Two &c2)

{cout<<c1.s1<<c2.s2<<"\n";}

У цьому прикладі оголошується дружня функція до класів One та Two. Це дає їй можливість мати доступ до закритих полів s1 та s2. Тут необхідне неповне оголошення класу Two.

Дружня функція також може бути членом класу. Синтаксично оголошення її реалізується з використанням операції розширення області видимості:

friend<тип результату><ім’я класу>::<ім’я функції-члена>(сигнатура);

Розглянемо приклад:

#include <iostream.h>

class One;

class Two{

friend void Show (One &c1,Two &c2);

private:

char*s2;

public:

Two(){s2="one,two,three";}