И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина





НазваниеИ. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина
страница22/32
Дата публикации01.09.2013
Размер1.4 Mb.
ТипЛекция
100-bal.ru > Информатика > Лекция
1   ...   18   19   20   21   22   23   24   25   ...   32

5. Упражнения

Упражнение 5.1


Имеется описание класса:

class CBase {

public :

virtual void Iam() { cout << "CBase\n"; }

};

Постройте два производных от CBase класса и для каждого определите функцию Iam() ("Я есть"), которая выводит имя класса в стандартный поток вывода. Создайте объекты этих классов и вызовите для них Iam().

Присвойте адреса объектов производных классов указателям CBase* и вызовите Iam() через эти указатели.

Упражнение 5.2


На рис. 6.2 показана иерархия классов, представляющих графические фигуры разной формы. От базового класса CShape унаследованы классы "Сфера", "Треугольная пирамида" и "Параллелепипед". У класса " Параллелепипед" (CBox) есть подкласс "Каркасный параллелепипед" (CWireBox).

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

В базовом классе CShape хранятся координаты центра фигуры. У базового класса есть следующие функции-члены:

  • Draw – нарисовать фигуру;

  • Move – передвинуть фигуру;

  • GetCenter – вернуть координаты центра фигуры.

Функции-члены GetCenter и Move являются общими для всех подклассов и не требуют обязательного переопределения. Однако, поскольку только подклассы могут знать, как их изображать, то функция Draw() должна быть виртуальной и переопределяться в подклассах.


Рис. 6.2. Иерархия классов "графические фигуры".
Класс CSphere имеет переменную radius и соответствующие функции-члены для задания (SetRadius) и чтения значения этой переменной. Функция-член Draw у этого класса формирует изображение сферы заданного радиуса с центром в точке сenter. В классе СBox есть переменные height (высота), width (ширина) и depth (высота) и соответствующие функции для задания и чтения их значений. Функция Draw в данном классе формирует изображение параллелепипеда заданных размеров с центром в заданной точке center. Подкласс CWireBox наследует все особенности класса CBox, но операция Draw в этом подклассе переопределена.
Рассмотрим следующий фрагмент программы:

CShape* shapes[10];

// Здесь объекты создаются и инициализируются

...

for ( int i = 0; i < 10; i++ )

shapes[i]->Draw();

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

Упражнение 5.3


Примените наследование в программе для имитации бильярда, которая описана в 5-й лекции. Классы "Шар", "Луза" и "Стенка" унаследуйте от базового класса "Графический объект". Этот класс определяется следующим образом:
class CGraphicalObject {

public:

CGraphicalObject( int left, int top, int right, int bottom );

// Операции, выполняемые графическими объектами

virtual void Draw() {;}

virtual void Update() {;}

virtual void HitBy( CGraphicalObject* pObj ) {;}
// Функции-члены для доступа к переменным класса

CRect GetRegion() { return region; }

CGraphicalObject* GetLink() { return pLink; }
protected :

CRect region;

CGraphicalObject* pLink;

};
В конструкторе просто запоминаются координаты экранной области, в которую вписано изображение объекта. Функции-члены Draw(), Update() и HitBy() ничего не делают, так как их фактическое поведение определено в подклассах.
CGraphicalObject::CGraphicalObject( int left, int top,

int right, int bottom )

{

region.SetRect( left, top, right, bottom );

}
Теперь классы СBall, СWall и СHole объявляются как подклассы класса СGraphicalObject, и внутри них ни к чему объявлять данные или функции, если только они не переопределяются:
class CHole : public CGraphicalObject {

public:

CHole( int x, int y, CGraphicalObject* pNextObj );

// Рисование лузы

virtual void Draw();

// Извещение лузы о том, что в нее попал шар

virtual void HitBy( СGraphicalObject* pObj );

};
Функция-член HitBy должна преобразовать тип параметра в СBall*. Для этого применяется оператор приведения типа dynamic_cast. (Чтобы можно было пользоваться этим оператором в MS Visual C++, надо разрешить работу средств RTTI командой ProjectSettingsC/C++C++ LanguageEnable Run-Time Type Information (RTTI))
void CHole::HitBy( CGraphicalObject* pObj )

{

CBall* pBall = dynamic_cast( pObj );
if ( pBall )

{

pBall->SetEnergy( 0.0 );

if ( pBall->IsCue() )

pBall->SetCenter( 50, 108 );

else

{

pBall->SetCenter( 10 + saveRack*15, 250 );

saveRack++; // Увеличение счетчика забитых шаров

}

}

}
Наибольшее упрощение в программе достигается за счет того, что теперь можно держать все графические объекты в одном списке. Функция, рисующая всю сцену, записывается так:
void CALLBACK Display()

{

glClear( GL_COLOR_BUFFER_BIT );

CGraphicalObject* pObj = listOfObjects;

while ( pObj )

{

pObj->Draw();

pObj = pObj->GetLink();

}

auxSwapBuffers();

}
Наиболее важным местом этой функции является вызов функции-члена Draw() внутри цикла. Несмотря на то что вызов написан один, иногда будет вызываться функция класса CBall, а в других случаях – класса CWall или CHole.

Часть функции СBall::Update(), проверяющая, ударился ли движущийся шар обо что-нибудь, также упрощается аналогичным образом.
1   ...   18   19   20   21   22   23   24   25   ...   32

Похожие:

И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconИ. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной...
...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconИ. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной...
...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПротокол №5 От 12 января 2012 г Заседания кафедры электроники и вычислительной...
Зав кафедрой Хакимова Г. Г. сообщила, что кафедра проводит 2-й Чемпионат по цифровой схемотехнике
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconМетодические рекомендации по подготовке, оформлению, предзащите и...
В. А. Усков, заместитель декана естественно-географического факультета по развитию, доцент кафедры физической географии и методики...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПроблемы коммуникации
М. Е. Евсевьева (зав кафедрой, доцент А. А. Ветошкин); С. А. Борисова, директор Института международных отношений Ульяновского государственного...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПрограмма по формированию навыков безопасного поведения на дорогах...
Елена Святославовна Симакова, кандидат педагогических наук, доцент кафедры гуманитарных и естественнонаучных дисциплин Рязанского...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПрограмма курса по выбору «Орнитология» предназначена для студентов...
Автор программы: к б н., доцент, зав кафедрой биологии и химии Марина Николаевна Харламова
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРоссийской Федерации Федеральное государственное образовательное...
Петренко И. М., зав кафедрой экономической теории, д-р экон наук профессор Дулин М. П., зав кафедрой педагогики и психологии, д-р...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРахманкулова Людмила Кузьминична, кандидат филологических наук, доцент...
Автор программы: С. А. Виноградова, кандидат филологических наук, доцент, зав кафедрой английского языка и английской филологии
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconПрограмма по формированию навыков безопасного поведения на дорогах...
...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconЛингвистические проблемы
Московского государственного педагогического института иностранных языков им. М. Тореза (зав кафедрой доцент Ю. А. Денисенко); д-р...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconМгпу учебно-методический комплекс дисциплины
А. В. Прялухина, кандидат психологических наук, доцент, зав кафедрой психологии Российского государственного социального университета...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРабочая программа по дисциплине «теория экономического анализа»
Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconРабочая программа по дисциплине «международный менеджмент»
Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconМетодические рекомендации по написанию курсовых работ дисциплине
Рецензент: к с н., доцент, зав кафедрой «Экономики и управления на предприятии и маркетинга» Пятигорского государственного гуманитарно-технологического...
И. П. Гиривенко к т. н., доцент, зав кафедрой информатики и вычислительной техники Рязанского государственного педагогического университета им. С. А. Есенина iconУчебное пособие Краснодар 2008
В. А. Оробец); кафедра паразитологии и ветсанэкспертизы Донского государственного аграрного университета (зав кафедрой, проф., к...


Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
100-bal.ru
Поиск