Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курс лекцій.doc
Скачиваний:
15
Добавлен:
03.11.2018
Размер:
1.12 Mб
Скачать

9 Друзі

Інкапсуляція даних - одна з основних переваг ООП. Проте в С++ існує можливість обійти правила інкапсуляції, тобто доступу до різних частин опису класу.

9.1 Дружні класи.

В класі можна оголосити інший клас як дружній. Один клас (в якому оголошується друг) дає можливість іншому класу(другу) мати доступ до всіх закритих та захищених членів першого класу. Як відомо, відкриті члени завжди доступні. Тому немає необхідності оголошувати один клас другом іншого, щоб дати йому доступ до відкритих членів останнього. Механізм дружніх класів використовується у випадках, коли для двох класів, не пов’язаних “родинним” відношенням, необхідний доступ до закритих та захищених секцій класів. Нехай оголошений такий клас:

class Aclass{

private:

double v;

public:

Aclass() {v=3.14159;}

};

Нехай оголошено ще один клас:

class Bclass{

private:

Aclass anobject;

public:

void ShowValue(void)

{cout <<anobject.value;}

};

Член anobject типу Aclass є закритим в класі Bclass. Тому в наведеному вище прикладі буде видане повідомлення про помилку. Вийти з цієї ситуації можна, якщо оголосити клас Bclass другом класу Aclass. Для цього використовується ключове слово friend:

class Aclass{

friend class Bclass;

private:

double v;

public:

Aclass() {v=3.14159;}

};

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

1. В класі повинні бути перераховані всі його друзі.

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

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

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

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

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

class Pal{

friend class Buddy;

private:

int x;

protected:

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

public:

pal(){x=100;}

pal(int n){x=n;}

};

class Buddy{

private:

Pal palobject;

public:

void ShowValues(void);

};

main()

{Buddy aBuddy;

aBuddy.ShowValues();

return 0;

}

void Buddy:: ShowValues(void)

{Pal aPal(1234);

cout<<“\n before palobject.x=“<< palobject.x;

palobject.doublex();

cout<<“\n after palobject.x=“<< palobject.x;

cout<<“\n apal.x=“<<aPal.x<<“\n”;

}

Допускаються взаємно-дружні класи. При цьому необхідне додаткове неповне оголошення класу:

class Bclass;

class Aclass{

friend class Bclass;

//. . .

};

class Bclass{

friend class Aclass;}

В цьому прикладі неповне оголошеня класу class Bclass; перед визначенням класу Aclass необхідне, якщо в класі Aclass є посилання по імені на другий клас, наприклад в параметрі функції-члена.