Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections_rus.doc
Скачиваний:
31
Добавлен:
06.02.2016
Размер:
1.41 Mб
Скачать

10.3.4. Иерархия классов библиотеки графичкских фигур

10.3.5. Таблица наследования

Класс-потомок

Circle

Arc

Smile

Rect

Bar

Line

Наследова-ние

Figure

Circle

Arc

Figure

Rect

Rect

Получено

LineStyle, Color, FillStyle, x1, y1

LineStyle, Color, FillStyle, x1, y1, r, SetRadius, SetCoord

LineStyle, Color, FillStyle, x1, y1, r, SetRadius, SetCoord, SetArc, s1,e1

LineStyle, Color, FillStyle, x1, y1

LineStyle, Color, FillStyle, x1, y1, SetCorners, x2, y2

LineStyle, Color, x1, y1, x2, y2

Добавлено

r, SetRadius, SetCoord

SetArc, s1,e1

SetCorners, x2, y2

Переопре-делено

Show

Show

Show

Show

Show

Show

10.3.6. Диаграмма модулей

10.3.7.Директивы препроцессора

Директивы препроцессора представляют собой инструкции, записанные в тексте программы на СИ, и выполняемые до трансляции программы. Директивы препроцессора позволяют изменить текст программы, например, заменить некоторые лексемы в тексте, вставить текст из другого файла, запретить трансляцию части текста и т.п. Все директивы препроцессора начинаются со знака #. После директив препроцессора точка с запятой не ставятся.

Хедер подключается всегда nраз, гдеn- количество егоinclude. Эти манипуляции с препроцессором никак не связаны с подключением хедера.

Чтобы понять, как это дело работает, нужно представлять, как компилируется проект.

На вход подаются только cpp-файлы. Про хедеры компилятор изначально ничего не знает. Единица компиляции - одинcppфайл. Между компиляцией разныхcppфайлов компилятор всё "забывает". Он не помнит ни определенные через #defineимена, ни уже подключенные хедеры. Каждый файлик заново обрабатывает, как-будто его впервые видит. Директива #includeтупо вставляет содержимое прописанного там файла, т.е. в итоге компилятор получит не кучу мелких хедеров и одинcpp, а слепленные в один все эти файлы.

Теперь собственно как работает #ifndef... #endif. При первом подключении хедера, имя, описанное после #ifndefне определено, соответственно вместо #includeвставится всё, что находится между #ifndefи #endif, в том числе сработает и #define, который определит нужное имя. При повторном включении хедера, уже #ifndefне сработает, т.е. всё, что между #ifndefи #endifкомпилятор не получит, а это собственно весь код хедера. В итоге во второй раз хедер успешно подключится, только вот это будет пустая строка. Не зря я упоминал про единицы компиляции, т.к. под повторным включением тут подразумевается включение одного и того же хедера в один и тот жеcppфайл. Для другогоcppфайла #ifndefтак же сработает один раз и у него в итоге будет своя копия хедера. В общем, каждыйcppфайл в итоге скомпонуется со своими копиями хедеров. Если в хедере описана переменная без ключевого словаextern, то у каждогоcppфайла будет свой экземпляр переменной, что приведет к трудно уловимой ошибке. Поэтому все глобальные переменные нужно описывать в хедерах исключительно с ключевым словомextern(externinta, а "реализовывать" уже в каком-нибудь одномcppфайле по обычному сценарию (inta.externв данном случае будет говорить, что где-то есть целочисленная переменная а, а описание переменной вcppфайле уже создаст эту переменную.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]