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


В классе можно объявить другой класс дружественным. Один класс (в котором объвляется друг) дает другому классу (другу) возможность доступа ко всем закрытым членам первого класса. Обычно дружественные классы используются, когда двум классам, не связанным отношением родства, необходим доступ к закрытым или защищенным членам класса.

class One {

friend class Two; //класс Two друг класса One

private:

double value; //закрытый член класса

public:

One() { value = 3.14159; }

};

class Two {

private:

One object;

public:

//доступ к закрытому члену value

void ShowVal(void) { cout << object.value; }

};

— В классе должны быть заранее перечисленны все его друзья.

— Класс, в котором содержаться закрытые и защищенные дан-ные и в котором объявлен другой класс другом, дает возможность другу специальный доступ к обычно скрытым членам. Класс не может объявлять себя другом другого класса.

— Дружественный класс может объявляться до или после класса, которому он друг. Порядок объявления не играет роли, однако дружественные классы обычно объявля-ется последними, чтобы встраиваемые функции класса могли обращаться к закрытым или защищенным членам класса.

— Производные от дружественных классов не наследуют специального доступа к первоначально закрытым и защищенным членам исходного класса.

— Производный класс может быть другом своего базового класса, хотя в этом случае использование членов базо-вого класса и предоставление дружественного доступа приводит к тем же результатам.

//Программа 1 Пример объявления дружественного класса

#include <iostream.h>

class One {

friend class Two; //класс Two друг класса One

private:

int x;

protected:

void doublex(void) { x *= x; } //доступен One и Two

public:

One() { x = 100; } //конструктор 1

One(int n) { x = n; } //конструктор 2

};

class Two {

private:

One object; //доступен только Two

public:

void ShowVal(void); //доступна всем

};

void main()

{

Two aTwo;

aTwo.ShowVal();

}

void Two::ShowVal(void)

{

One aOne(1234);

cout << endl << "Before, object.x == " << object.x;

object.doublex();

cout << endl << "After, object.x == " << object.x;

cout << endl << "aOne.x == " << aOne.x << endl;

}

Два класса могут объявить себя взаимнодружественными клас-сами.

class Two;

class One {

friend class Two;

. . . . . . . . .

};

class Two {

friend class One;

. . . . . . . . .

};