Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Объединения

Объединения, определяемые с помощью ключевого слова union, похожи по своему виду на структуры:

union имя_этикетка {список_элементо}] [переменные];

Отличие состоит в том, что все элементы объединения занимают одно и то же место в памяти, они перекрываются. Компилятор отводит под объединение память, достаточную для размещения наибольшего элемента. Объединения полезны, когда требуется обеспечить своего рода “полиморфное поведение” некоторого объекта. Объединения используют, когда значения переменных объединения не используются в программе одновременно, а используются поочередно. Можно использовать объединения для преобразования типов.

union sm

{ int ival;

float fval;

char cval;

) uval;

Размер ОП, выделенной под объединение определяется наименьшего поля, достаточного для любой переменной объединения.

uval.ival=5; uval.fval=3.5; uval.cval=’f’;

Имена переменных нельзя использовать в качестве параметров функций и передавать в качестве результатов работы функций.

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

Доступ к элементам объединения (их иногда называют разделами) осуществляется так же, как и в структурах, — посредством точки или стрелки, за которыми следует имя раздела.

В программе определяется тип структуры, способной хранить данные различных “графических объектов”. В программе реализованы всего два их вида — прямоугольник и текстовая метка.

#pragma hdrstop

#include <stdio.h>

#include <conio.h>

#include <string.h>

/* Тип для определения вида объекта */

typedef enum {Rect=l, Lab} Vid;

// Структура для хранения прямоугольников и текстовых меток.

typedef struct _Gform

{ Vid type;

struct _GForm *next; // Указатель для связанного списка.

union data{ // Анонимное объединение.

struct { // Прямоугольник.

int left, top;

int right, bottom;

} rect;

struct { // Текстовая метка.

int x, у;

char text [20];

} labl;

}

} Gform;

 

// Функция вывода данных объекта.

void ShowForm(GForm *,f)

{

switch (f->type) {

case Rect: // Прямоугольник.

printf("Rectangle: (%d, %d) (%d, %d)\n", f->data.rect.left, f->data.rect.top,

f->data.rect.right, f->data.rect.bottom);

break;

case Lab: /* Метка. */

printf('Text label: (%d, %d) \"%s\"\n", f->data.labl.x, f->data.labl.y, f->data.labl.text);

}

int main(void)

{

GForm form1, form2;

/* Инициализация первого объекта. */

form1.type = Rect;

form1.data.rect.left = 50;

form1.data.rect.top = 25;

form1.data.rect.right = 100;

form1.data.rect.bottom = 75;

/* Инициализация второго объекта. */

form2.type = Lab;

form2.data.labl.x = 60;

form2.data.labl.у = 40;

strcpy(form2.data.labl.text, "This is a Label!");// Распечатка...

ShowForm(&form1);

ShowForm(&form2);

printf("\nPress any key...");

getch();

return 0;

}

Перечисления, структуры и объединения могут быть анонимными, т. е. не иметь имен-этикеток.

Структура _Gform имеет, как таковая, три элемента: Vid, next (не используется) и data. Последний является анонимным объединением разделов rect и labl, каждый из которых, в свою очередь, является анонимной структурой. Элементы первой хранят значения координат верхнего левого и правого нижнего углов прямоугольника; элементами второй являются координаты, задающие положение текста, и сама текстовая строка. Получаются довольно длинные выражения для доступа к элементам данных (form1.data.rect.bottom).


<== предыдущая лекция | следующая лекция ==>
Структуры | Лекция 10. В стандарте языка С++ отсутствуют средства ввода-вывода
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 299; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.016 сек.