R Справочное руководство по С++

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).


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.