logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.9.7 Вложенные описания классов

Класс можно описать в описании другого класса. Такой класс называют

вложенным. Имя вложенного класса локально по отношению к

объемлющему классу. Вложенный класс находится в области видимости

объемлющего класса. Если не считать явного использования указателей,

ссылок или имен объектов, то в описаниях вложенного класса допустимы

только имена типов, статических членов и элементов перечисления

из объемлющего класса.

int x;

int y;

class enclose {

public:

int x;

static int s;

class inner {

void f(int i)

{

x = i; // ошибка: присваивание enclose::x

s = i; // нормально: присваивание enclose ::s

::x = i; // нормально: присваивание глобальному x

y = i; // нормально: присваивание глобальному y

}

void g(enclose* p, int i)

{

p->x = i; // нормально: присваивание enclose ::x

}

};

};

inner* p = 0; // ошибка: `inner' вне области видимости

Функции-члены вложенного класса не имеют особых прав доступа к членам

объемлющего класса, они подчиняются обычным правилам доступа ($$R.11).

Аналогично, функции-члены объемлющего класса не имеют особых прав

доступа к членам вложенного класса и подчиняются обычным правилам

доступа, например:

class E {

int x;

class I {

int y;

void f(E* p, int i)

{

p->x = i; // ошибка: E::x частный член

}

};

int g(I* p)

{

return p->y; // ошибка: I::y частный член

}

};

Функции-члены и представляющие данные, статические члены из вложенного

класса можно определить в глобальной области видимости, например:

class enclose {

class inner {

static int x;

void f(int i);

};

};

typedef enclose::inner ei;

int ei::x = 1;

void enclose::inner::f(int i) { /* ... */ }

Подобно функции-члену дружественная функция, определенная в данном

классе, находится в области видимости этого класса. Она подчиняется

тем же правилам связывания имен, что и функции-члены (они указаны выше

и в $$R.10.4), и не имеет так же как они особых прав доступа к

членам объемлющего класса и к локальным переменным функций этого

класса ($$R.11).