ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 4) онлайн

Вложенные структуры

Структуры допускают вложенность, то есть использование структурной перемен- ной в качестве поля какой-либо другой структуры. Внесем дополнения в програм- му ENGLSTRC, которые позволят это продемонстрировать. Пусть нам необходимо хранить данные о размерах комнаты, то есть ее ширину и длину. Поскольку мы работаем с английской системой мер, нам придется хранить эти величины с исполь- зованием типа Distance:

 struct Room  {

 Distance length;  Distance width;

 }

// englarea.cpp

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

#include <iostream>

using namespace std;

//////////////////////////////////////////////////////////

struct Distance            // длина в английской системе

{

  int feet;             // футы

  float inches;     // дюймы

};

//////////////////////////////////////////////////////////

struct Room                // размеры прямоугольной комнаты

{

  Distance length;         // длина

  Distance width;          // ширина

};

//////////////////////////////////////////////////////////

int main()

{

  Room dining;             // переменная dining типа Room

  dining.length.feet = 13; // задание параметров комнаты

  dining.length.inches = 6.5;

  dining.width.feet = 10;

  dining.width.inches = 0.0;

  // преобразование длины и ширины в вещественный формат

  float l = dining.length.feet + dining.length.inches/12;

  float w = dining.width.feet + dining.width.inches/12;

  // вычисление площади комнаты и вывод на экран

  cout << "Площадь комнаты равна " << l * w

  << " квадратных футов\n";

  return 0;

}

 

В данной программе используется единственная переменная dining, имеющая тип Room:

Room dining;     // переменная dining типа Room

Затем программа производит различные действия с полями этой структур- ной переменной.

Доступ к полям вложенных структур

Если одна структура вложена в другую, то для доступа к полям внутренней структуры необходимо дважды применить операцию точки (.):

dining.length.feet = 13;

В этом операторе dining — имя структурной переменной, как и раньше; length — имя поля внешней структуры Room; feet — имя поля внутренней струк- туры Distance. Таким образом, данный оператор берет поле feet поля Length пере- менной dining и присваивает этому полю значение, равное 13. Иллюстрация этого механизма приведена на рис. 4.6.

Рис. 4.6. Операция «точка» и вложенные структуры

Когда поля переменной dining инициализированы, программа подсчитывает площадь комнаты, как показано на рис. 4.7.

Чтобы найти площадь комнаты, программе необходимо выразить значения длины и ширины в футах. Для этого используются переменные l и w типа float. Их значения получаются путем сложения числа футов соответствующего изме- рения с числом дюймов, деленным на 12. Преобразование целого типа поля feet к типу float произойдет автоматически, и результат сложения будет иметь тип float. Затем переменные l и w перемножаются, в результате чего мы получаем значение площади комнаты.

Преобразования пользовательских типов данных

Обратите внимание на то, что программа преобразовывает две величины типа Distance к двум величинам типа float. Кроме того, при вычислении площади ком- наты на самом деле осуществляется преобразование переменной типа Room, хра- нящей два значения типа Distance, к одному вещественному значению. Результат работы программы выглядит так:

Площадь комнаты равна 135.416672 квадратных футов

 

Возможность преобразования значений одного типа в значения другого типа является важным аспектом для программ, которые используют типы данных, определяемые пользователем.

Инициализация и вложенные структуры

Каким образом инициализировать структурную переменную, которая содержит внутри себя поле, также являющееся структурной переменной? Следующий опе- ратор инициализирует переменную dining теми же значениями, что и в послед- ней программе:

Room dining = { {13, 6.5} , {10, 0.0} };

Каждая структура Distance, входящая в состав типа Room, инициализируется отдельно. Как мы уже говорили, значения, которыми инициализируется струк- турная переменная, заключаются в фигурные скобки и разделяются запятыми. Первая из внутренних структур Distance инициализируется с помощью конструкции:

{13, 6.5}

 

а вторая — с помощью конструкции:

{10, 0.0}

Инициализировав по отдельности каждое из полей типа Distance, мы инициа- лизируем переменную типа Room, заключив значения типа Distance в фигурные скобки и разделив их запятыми.

Глубина вложения

Теоретически не существует ограничения на величину уровня вложенности структур. В программе, работающей с дизайном квартир, вы встретите такое об- ращение к полю структурной переменной:

apartment1.laundry_room.washing_machine.width.feet

 

10