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

  Юрий  | 

  |

  Обновл. 13 Сен 2021  | 

 36583

 ǀ   6 

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

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

Комментариев: 6

  1. Сергей:

    Если перечисление (или другой тип данных) будет внутри класса, то в каждом объекте будет создаваться одно и тоже перечисление.
    Не слишком экономный расход памяти выходит. Правильно ли я понимаю?

    1. Андрей:

      Мне кажется, расход памяти будет только если в классе под этот тип выделена переменная (например FruitList m_type; ), от самого по себе вложения типа в класс ничего происходить при создании объекта не будет, эффект будет такой же, как при объявлении перечисления (или иного типа) вне класса. Но я сам тут учусь)

  2. Кирилл:

    Огромное вам спасибо за ваш труд!

    1. Фото аватара Юрий:

      Пожалуйста))

  3. Spleentery:

    Пожалуйста добавьте тёмный фон, глаза от белого болят

    1. Фото аватара Юрий:

      Уже пробовал, тестил и даже на продакшен (сайт Равесли) это всё заливал, но из-за недостаточно эффективного кода реализации, это создавало определенные "микрозадержки" и сбои при переходе/обновлении страниц + на сайте много элементов, фон и цвет которых изменить трудно, так как подключены эти элементы сторонними плагинами или сторонними скриптами. Соответственно, результат получался "лишь частично" (коряво) и свесив все плюсы и минусы, я решил не добавлять данный функционал (кнопка с тёмной версией).

      P.S. Пробовал также реализацию ночной темы для сайта через сторонние плагины WordPress — откровенно плохой результат получался. Поэтому данную проблему Вы можете решить пока что только на своей стороне, добавив специальный плагин в Google Chrome (который также далеко не всегда идеально работает).

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

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