Введение в язык Си++

Вложенные Классы


Описание класса может быть вложенным. Например:

class set { struct setmem { int mem; setmem* next; setmem(int m, setmem* n) { mem=m; next=n; } }; setmem* first; public: set() { first=0; } insert(int m) { first = new setmem(m,first);} // ... };

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

class set { struct setmem { int mem; setmem* next; setmem(int m, setmem* n) }; // ... };

setmem::setmem(int m, setmem* n) { mem=m, next=n} setmem m1(1,0);

Такая запись, как set::setmem::setmem(), не является ни необходимой, ни допустимой. Единственный способ скрыть имя класса - это сделать это с помощью метода файлы-как-модули. Большую часть нетривиальных классов лучше описывать раздельно:

class setmem { friend class set; // доступ только с помощью членов set int mem; setmem* next; setmem(int m, setmem* n) { mem=m; next=n; } };

class set { setmem* first; public: set() { first=0; } insert(int m) { first = new setmem(m,first);} // ... };


Класс может быть описан внутри другого класса. В этом случае область видимости имен внутреннего класса его и общих имен ограничивается охватывающим классом. За исключением этого ограничения допустимо, чтобы внутренний класс уже был описан вне охватывающего класса. Описание одного класса внутри другого не влияет на правила доступа к закрытым членам и не помещает функции члены внутреннего класса в область видимости охватывающего класса. Например:

int x;

class enclose /* охватывающий */ { int x; class inner { int y; f () { x=1 } ... }; g (inner*); ... };

int inner; /* вложенный */

enclose.g (inner* p) { ... }

В этом примере x в f ссылается на x, описанный перед классом enclose. Поскольку y является закрытым членом inner, g не может его использовать. Поскольку g является членом enclose, имена, использованные в g, считаются находящимися в области видимости класса enclose. Поэтому inner в описании параметров g относится к охваченному типу inner, а не к int.



Содержание раздела