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

   | 

   | 

 Обновлено 24 Мар 2018  | 

 1762

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

В этой программе всё работает. Но поскольку перечисление 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 (17 оценок, среднее: 4,94 из 5)
Загрузка...
Подписаться на обновления:

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

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

ВОЛШЕБНАЯ ТАБЛЕТКА ПО С++