Главная » Просмотр файлов » А.В. Столяров - Введение в язык Си++

А.В. Столяров - Введение в язык Си++ (1114949), страница 21

Файл №1114949 А.В. Столяров - Введение в язык Си++ (А.В. Столяров - Введение в язык Си++) 21 страницаА.В. Столяров - Введение в язык Си++ (1114949) страница 212019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 21)

Ч и сто ви р ту альн ы е ф ун кц и и .А б страктн ы е кл ассыКак отмечалось в сноске на стр. 92, наследование класса «окруж­ность» от класса «точка» нарушает принципы объектно-ориентирован­ного проектирования, поскольку окружность не является частным слу­чаем точки. Попробуем исправить ситуацию. Для этого заметим, что иточка, и окружность — частные случаи геометрических фигур, причёмможно считать, что каждая геометрическая фигура обладает цветом иимеет координаты точки привязки. Для обычной точки в качестве точкипривязки выступает она сама, для окружности точкой привязки будет еёцентр. Для других фигур точку привязки можно выбрать разными спо­собами; так, для какого-нибудь прямоугольника это может быть либоцентр пересечения диагоналей, либо одна из вершин, и т.

и.Отметим, что такое представление об абстрактном понятии геометри­ческой фигуры позволяет нам указать единый для всех фигур алгоритмпередвижения фигуры по экрану: стереть фигуру с экрана, изменитькоординаты точки привязки, отрисовать фигуру в новом месте. С этималгоритмом мы уже знакомы, он был реализован в функции MoveQ настр. 92.Теперь уже ясно, как нужно изменить архитектуру нашей библиоте­ки классов, чтобы привести её в соответствие с основными принципа­ми объектно-ориентированного программирования.

Понятия «точка» и«окружность» не являются частными случаями друг друга, но оба они96являются частным случаем понятия «геометрическая фигура». Поэтому,если мы опишем класс для представления абстрактной геометрическойфигуры и от него унаследуем оба класса P ix el и C ircle, такая архи­тектура будет полностью удовлетворять требованиям теории объектно­ориентированного проектирования.Прежде чем приступать к описанию класса, представляющего гео­метрическую фигуру, отметим ещё один важный момент. Описывая впредыдущем параграфе классы для точек и окружностей, мы не писаликонкретных тел для методов ShowQ и Hide(), но предполагали при этом,что в рабочей программе тела этих методов будут описаны (с учетомконкретной платформы разработки, используемой графической библио­теки и т.

и.). В противоположность этому, тела методов ShowQ и Hide Одля абстрактной геометрической фигуры описать невозможно-, действи­тельно, как можно нарисовать на экране фигуру, относительно которойнеизвестно, как она выглядит?!Несмотря на это, мы точно знаем, как будет выглядеть функцияMove () в предположении, что для классов-потомков будут правильноописаны методы ShowQ и Hide О . Иначе говоря, мы знаем, что все объ­екты классов-потомков данного класса должны уметь получать сообще­ние определённого типа, но мы не можем при описании базового классаописать какую бы то ни было реакцию на такие события, поскольку та­ковая реакция полностью зависит от типа нашего потомка.

При этомдля описания некоторых других (более общих) методов базового классанам необходимо знание о том, что реакция на соответствующие событиябудет предусмотрена во всех наших потомках.Язык С и + + имеет специальный механизм, отражающий подобныеслучаи.

Этот механизм называется ч и с т о в и р ту ал ьн ы е функции(англ, pure virtual functions). Описывая в классе чисто виртуальнуюфункцию, программист информирует компилятор о том, что функция стаким профилем будет существовать во всех классах-потомках, что поднеё необходимо зарезервировать позицию в таблице виртуальных функ­ций, но при этом сама функция (её тело) для базового класса описы­ваться не будет, так что значение адреса этой функции в таблице вирту­альных функций следует оставить нулевым.

Синтаксис описания чистовиртуальной функции таков:c la s s А {II . . .v ir tu a l void fQ = 0;И ...>;97Видя на месте тела функции специальную лексическую последователь­ность «= 0 ;», компилятор воспринимает функцию как чисто виртуаль­ную2.Если в порождённом классе не описать одну из функций, объявлен­ных в базовом классе как чисто виртуальные, компилятор считает, чтофункция осталась чисто виртуальной и предполагает, что от такого клас­са, в свою очередь, будет унаследован потомок, который и определит,наконец, конкретное тело для виртуальной функции соответствующегопрофиля.Класс, в котором есть хотя бы одна чисто виртуальная функция, на­зывается а б с т р а к т н ы м классом . Полезно будет запомнить, что ком­пилятор не п озволяет со зд авать объекты абстрактн ы х классов.Единственное назначение абстрактного класса — служить базисом дляпорождения других классов, в которых все чисто виртуальные функциибудут конкретизированы.Подытожим наши рассуждения.

Чтобы соответствовать принципамобъектно-ориентированного программирования, нам следует описатькласс, представляющий абстрактную геометрическую фигуру, облада­ющую цветом и координатами точки привязки, но не обладающуюконкретной формой; назовём этот класс GraphObject. Классы P ixelи C ircle нужно переписать, унаследовав от GraphObject. В классеGraphObject методы ShowQ и HideQ будут объявлены как чисто вирту­альные, что сделает сам этот класс абстрактным классом.Опишем теперь класс GraphObject:c la s s GraphObject {protected :double x , у ;in t co lo r;p u b lic :GraphObject(double ax, double ay, in t acolor): x (a x ), у (a y ), c o lo r(aco lo r) -Qv ir tu a l "GraphObject() -Qv ir tu a l void ShowQ = 0;v ir tu a l void HideQ = 0;void Move(double nx, double n y );>;Описание функции MoveQ мы не приводим, поскольку оно слово в сло­во повторяет описание метода P i x e l :: MoveQ на стр.

92. Отметим, чтов теле функции MoveQ вызываются функции ShowQ и HideQ. То, что2Такой синтаксис трудно назвать удачным, особенно если учесть, что никакое чис­ло, кроме нуля, использоваться здесь не может; тем не менее, именно таков синтаксисв языке СиН—у.98тела для этих функций нами не заданы, не создаёт никаких проблем,поскольку для любого класса-потомка, объекты которого можно будетсоздавать, таблица виртуальных методов будет содержать адреса кон­кретных функций, описанных в этом классе-потомке.Заголовки классов P ix el и C irc le будут теперь выглядеть так:c la s s P ix el : public GraphObject {p u b lic :P ixel(double x , double y, in t col): GraphObject(x, y, co l) -Qv ir tu a l " P ix e l() -Qv ir tu a l void Show( ) ;v ir tu a l void HideQ ;>;c la s s C ircle : pu blic GraphObject {double r a d iu s ;p u b lic :C ircle(double x , double y, double rad , in t color): GraphObject(x, y, c o lo r ), rad iu s(rad ) -Qv ir tu a l " C ir c le () { }v ir tu a l void Show( ) ;v ir tu a l void HideQ ;>;Для этих классов, в отличие от класса GraphObject, необходимо описатьконкретные тела методов ShowQ и HideQ.§4.7.

Н аследован и е р ад и частного сл у ч аякон струи рован и яВ практическом программировании часто применяют один упрощён­ный случай наследования, при котором класс-потомок отличается отпредка только набором конструкторов, то есть он не вводит ни новыхметодов, ни новых полей. Объекты такого класса создаются из сообра­жений экономии объёма кода, чтобы не повторять одни и те же действияпри конструировании однотипных объектов. Чтобы проиллюстрироватьсказанное на примере, для начала мы введём ещё один класс-потомоккласса GraphObject, представляющий ломаную линию, а затем опишемграфический объект «квадрат» как частный случай ломаной линии.Напомним, что каждая геометрическая фигура в нашей системе име­ет точку привязки; ломаную при этом проще всего хранить в виде спис­ка координатных пар, задающих смещение каждой вершины ломаной99относительно точки привязки.

Для организации такого списка мы в за­крытой части класса опишем структуру, задающую элемент списка. Ис­ходно будем создавать ломаную, не имеющую ни одной вершины, а длядобавления новых вершин будем использовать метод, который назовёмAddVertexQ3. Напишем заголовок класса:c la s s PolygonalChain : public GraphObject {s tru c t Vertex {double dx, dy;Vertex *n e x t;>;Vertex * f i r s t ;p u b lic :PolygonalChain(double x , double y, in t color): GraphObject(x, y, c o lo r), fir s t(O ) -Qv ir tu a l "PolygonalChain( ) ;void AddVertex(double adx, double ad y );v ir tu a l void Show( ) ;v ir tu a l void HideQ ;>;Функция AddVertex () будет (для экономии усилий) добавлять новуювершину в начало списка, а не в конец; линия при этом будет изобра­жаться на экране в обратном порядке, но это, естественно, ничего неизменит:void PolygonalChain:: AddVertex(double ax, double ay) {Vertex *tmp = new Vertex;tmp->dx = ax;tmp->dy = ay;tmp->next = f i r s t ;f i r s t = tmp;}Ясно, что для объекта, использующего динамическую память, необходи­мо предусмотреть деструктор, освобождающий память.

Напишем его:PolygonalChain: : "PolygonalChain() {w h ile ( fir s t) {Vertex *tmp = f i r s t ;3Это лучше, чем пытаться тем или иным способом передать координаты вершинв конструктор, поскольку мы не знаем заранее количество вершин, так что для пере­дачи их в качестве параметра конструктора пришлось бы в том месте, где создаётсяобъект, формировать некую динамическую структуру данных (массив либо список),что потребовало бы дополнительных усилий.100f i r s t = f ir s t- > n e x t;d elete tmp;}}Как обычно, мы воздержимся от описания тел функций ShowQ и H ideQ ,но будем предполагать, что это сделано.Пусть теперь нам нужен класс для представления квадрата, стороныкоторого параллельны осям координат, а длина стороны задаётся па­раметром конструктора. Ясно, что такой квадрат представляет собойчастный случай ломаной, описываемой классом PolygonalChain.

Характеристики

Тип файла
PDF-файл
Размер
1,67 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
А знаете ли Вы, что из года в год задания практически не меняются? Математика, преподаваемая в учебных заведениях, никак не менялась минимум 30 лет. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6510
Авторов
на СтудИзбе
302
Средний доход
с одного платного файла
Обучение Подробнее