Здавалка
Главная | Обратная связь

Дружественные классы



Дружественность – возможность использования метода двумя и более объектами различных классов, связанных отношениями общности.

Дружественные классы необходимы в том случае, если не связанным отношением родства классам необходим доступ к закрытым или защищенным секциям одного из них.

#include <iostream.h>

//не правильный вариант

class A

{double x;

public:

A() {x=3.14;}

};

class System: public A

{public:

void f() {cout<<x;} //доступ к переменной x закрыт

};

//правильный вариант

class A

{ friend class System;

double x;

public:

A() {x=3.14;}

};

class System

{public:

A obj;

void f() {cout<<obj.x<<endl;}

};

Свойства друзей:

1) отношение дружественности не наследуются, то есть, если A дружественен B, а C порожден от A, то это не означает, что C становится автоматически дружественным B;

2) свойство дружественности не транзитивно, то есть, если класс А дружественен классу В, а класс В – классу С, то А не становится автоматически дружественным классу С;

3) свойство дружественности не коммутативно, то есть, если A дружественен B, то это не означает, что B дружественен A.

Но при этом A можно объявить дружественным B.

Взаимодружественные классы

class A; //неполное объявление класса

class B

{ friend class A;

public:

void f(A* c1) {};};

class A;

{ friend class B;};

Раздел, в котором помещено объявление friend, не имеет значения. Обычно для наглядности объявление friend для класса помещается в первой секции. Когда дружественной объявляется функция, объявление обычно помещается там, где была бы записана эквивалентная функция-член. Единственное ограничение, налагаемое на объявление friend, заключается в том, что это объявление должно находиться внутри объявления класса.

Дружественные функции

Дружественные функции применяются для доступа к скрытым полям класса и представляют собой альтернативу методам.

Пример использования дружественных функций: переопределенные операции вывода объектов.

Правила описания и особенности дружественных функций:

1) дружественная функция объявляется внутри класса, к элементам которого ей нужен доступ, с ключевым словом friend; в качестве параметра ей должен передаваться объект или ссылка на объект класса;

2) дружественная функция может быть обычной функцией или методом другого ранее определенного класса; на нее не распространяется действие спецификаторов доступа, место размещения ее объявления в классе безразлично;

3) одна функция может быть дружественной сразу нескольким классам.

class One;

class Two

{ char *s2;

public:

Two(){s2="1, 2, 3";}

void Show(One &c1);};

class One

{ friend void Two::Show(One &c1);

char *s1;

public:

One() {s1="Testing...";}};

void Two::Show(One &c1)

{ cout<<c1.s1<<s2<<endl;}

 

void main()

{ One c1;

Two c2;

c2.Show(c1);

return;}

Использование дружественных функций не рекомендуется, поскольку они нарушают принцип инкапсуляции.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.