Урок №128. Вложенные типы данных в классах

  Юрий  | 

    | 

  Обновл. 16 Июн 2019  | 

 5229

Рассмотрим следующий код:

В этой программе всё работает. Но, поскольку перечисление FruitList используется в связке с классом Fruit, то немного странно, что оно существует отдельно от самого класса.

Вложенные пользовательские типы данных в классах

В отличие от функций, которые не могут быть вложены (находится внутри друг друга), в C++ пользовательские типы данных могут быть определены (вложены) внутри класса. Для этого нужно просто определить пользовательский тип внутри класса под соответствующим спецификатором доступа.

Вот та же программа, что выше, но уже с FruitList, определённым внутри класса:

Обратите внимание:

   Во-первых, FruitList теперь определён внутри тела класса.

   Во-вторых, мы определили его под спецификатором доступа public, т.е. сделали доступ к FruitList открытым.

По сути, классы работают как пространства имён для любых вложенных типов. В первом примере мы имеем доступ к перечислителю AVOCADO напрямую, так как AVOCADO определён в глобальной области видимости (мы могли бы предотвратить это, используя класс enum вместо обычного enum, и тогда доступ к AVOCADO осуществлялся бы через FruitList::AVOCADO). Теперь, поскольку FruitList считается частью класса, доступ к перечислителю AVOCADO осуществляется через имя класса, например: Fruit::AVOCADO.

Обратите внимание, поскольку классы enum также работают как пространства имён, то, если бы мы поместили класс enum (вместо обычного enum) с именем FruitList во внутрь класса Fruit, то доступ к перечислителю AVOCADO осуществлялся бы через Fruit::FruitList::AVOCADO.

Другие вложенные пользовательские типы данных в классах


Хотя перечисления являются наиболее распространённым вложенным пользовательским типом данных внутри классов, C++ также позволяет определять и другие пользовательские типы внутри классов, такие как псевдонимы типов (typedef и type alias) и даже другие классы!

Как и любой обычный член класса, вложенный класс будет иметь доступ ко всем членам класса-оболочки (в котором он размещен). Однако, вложенные классы не имеют доступа к указателю *this класса-оболочки.

Определение вложенных типов не очень распространено, но стандартная библиотека C++ всё же использует это в некоторых случаях. Об этом детальнее поговорим в следующем уроке.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (45 оценок, среднее: 4,98 из 5)
Загрузка...

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *