Урок №136. Вкладені типи даних в класах

  Юрій  | 

  Оновл. 24 Вер 2021  | 

 157

Розглянемо наступний код:

У цій програмі все працює. Але оскільки перерахування 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 Зірок (6 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

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