Внутри методов вложенного класса указатель this является указателем на текущий объект вложенного класса.
Если вложенный класс объявлен как public, то его можно использовать в качестве типа во всей программе. Но поскольку класс вложенный, то его имя нужно писать с префиксом — именем объемлющего класса, например:
Outer::Inner *pointer:
Если вложенный класс объявлен в приватной части объемлющего класса, то он доступен только членам объемлющего класса и его друзьям. В этом случае компоненты вложенного класса обычно делают открытыми — тогда нет нужды объявлять объемлющий класс другом, например:
class Outer { //...
friend class Inner: // для Inner доступна приватная часть Outer
structure Inner // все элементы доступны в Outer
{ //...
};
//. . .
};
Естественно, имя вложенного класса должно быть уникально в объемлющем классе, но может совпадать с другими именами вне класса, например:
class А {/*...-*/ }; // внешний класс
class В { //...
class А {/*...*/ }: // вложенный класс
//. . .
};
В этом определении внешний класс А не конфликтует с вложенным классом А.
Методы вложенного класса можно реализовать непосредственно внутри класса. Если же методы вложенного класса определяются вне класса, то определение необходимо писать вне самого внешнего из объемлющих классов — в глобальной области видимости. Естественно, имя метода в таком случае должно иметь два префикса, образованные из имен вложенного и объемлющего классов. Вообще, количество префиксов должно быть равно уровню вложенности классов: первый префикс является именем самого объемлющего класса, второй — именем вложенного класса первого уровня, третий — именем класса, вложенного во вложенный класс, и т. д. Например, конструктор без аргументов класса Inner может быть определен таким образом:
Outer::Inner::Inner()
{ //...
}
Первое имя Inner — это имя класса, второе — имя самого конструктора.
В глобальной области видимости вне объемлющего класса можно определить и сам вложенный класс. Подобное определение выглядит отчасти парадоксально, но С++ разрешает это делать — если в объемлющем классе задать объявление класса. Например:
class А
II... class В; II...
II объявление вложенного класса
};
class А::В { //...
};
// внешнее определение вложенного класса
Доступность определенного таким образом класса зависит от того, в какой части объемлющего класса задано объявление: если объявление приватное, то и определение является приватным в объемлющем классе.
Зачем определять вложенный класс внешним образом? Это позволяет написать определение в отдельном файле1 и тем самым обеспечивает повышенный уровень инкапсуляции. |