ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
Схожі підручники
- Продажи и управление продажами Учеб. пособие для вузов (часть 5) (онлайн)
- Стан НПС та основні напрями природоохоронної політики Фінляндії управлінські, організаційні, економічні та юридичні аспекти
- Мне тебя обещали (онлайн)
- Економіка підприємства. Методичка
- Історія України основні теми
- Белая книга (частина 2) (онлайн)
