Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Объектно-ориентированное программирование

..pdf
Скачиваний:
11
Добавлен:
12.11.2023
Размер:
16.61 Mб
Скачать

6.4. Различие реализации объектных моделей C+ +, Delphi и C+ + Builder

TLabel *BeginLabel; TEdit *BeginEdit; TLabel *EndLabel; TEdit *EndEdit; TLabel *StepLabel; TEdit *StepEdit; TRadioGroup *TypeRadioGroup;

void_ _Jiastcall ExitButtonClick(TObject *Senderj; void_ _Jastcall BuildButtonClick(TObject *Sender);

public: _ _Jdstcall TMainFormfTComponent* Owner);

};

extern PACKAGE TMainForm *MainForm; Uendif

2. Описание методов M ainxpp

Mnclude <vcl.h> #pragma hdrstop #include "Main.h" Mnclude <SysUtils.hpp> #include "Grafic.h" Mnclude <vcl/dstring.h>

Upragmapackage(smart_init) ttpragma resource "*.dfm" TMainForm *MainForm; TDiagram *r=NULL;

Jastcall TMainForm::TMainForm(TComponent* Owner) :

 

TForm(Owner) {}

void _ Jastcall TMainForm::ExUButtonClick(TObject *Sender)

{ if (r!=NULL) delete r;

Closet):}

void _Jastcall TMainForm::BuildButtonCttck(TObject *Sender)

{ if (r!-NULL) delete r;

// если График существует - уничтожить

float xl-(float)StrToFloat(BeginEdit-> Text), x2= (float)StrToFloat(EndEdit-> Text), h = (float)StrToFloat(StepEdit->Texi);

if (TypeRadioGroup->ItemIndex==0) // конструирование Графика r=new TDiagram(ImagePanel,FEdit->Text.c_strQ+2,xl,x2,h);

else r=new TDiagraml(ImagePanel,FEdit->Text.c_strQ+2,xl,x2,h);

Модуль Grafic (описания классов TDiagram и TDiagraml) : 1. Заголовок Grafic.h

MfhdefgraflcH ^define graficH

Mnclude "FunctionUnit.h" class TDiagram:public TImage

301

6. Объектная модель C+ + Builder

{private: char *string; float xb,xe,h; protected: TRectwin;

virtual void _ Jastcall Draw(char *stfloat xbfloat xefloat h); public:

Jastcall TDiagram(TPanel *Panel,char *stfloat xbfloat xefloat h);

};

class TDiagraml:public TDiagram

{protected: virtual void _ Jastcall Draw(char *stfloat xbfloat xefloat h); public:

Jastcall TDiagraml(TPanel *Panel,char *stfloat xbfloat xefloat h): TDiagram(Panel,st,xb,xe,h){}

}; ttendif

2. Описание методов Grafic.cpp

Mnclude <vcl.h> #include <extctrls.hpp> #pragma hdrstop ^include "FunctionUnit.h" #include "grafic.h"

_ Jastcall TDiagram::

TDiagram(TPanel *Panel,char *stfloat xbfloat xefloat h):Tlmage(Panel) { Align = alClient; Parent=Panel;

win=Rect(0,0, Width,Height); Draw(st,xb,xe,h);

}

void _ Jastcall TDiagram::Draw(char *stfloat xbfloat xefloat h) {float *x, *y,ymin=]e30,ymax=-le30,mx,my; int i,k, *kx, *ky; bool key; k=(xe-xb)/h+1.5;

x=newfloat[k]; у -new float[kf; kx=new int[kj; ky=new intfk]; MyFunction F(st);

for(i=0;i<k;i++)

//вычисляем значения аргумента и функции

{x[ij=xb+i*h;

key-true; y[iJ=F.Count(x[i],key);

if ((y[i]>ymax)&key) ymax=y[i]; if ((y[i]<ymin)&key) ymin=y[i];

}

mx=win. WidthQ/(x[k-l]-x[0]); my=win.Height()/(ymax-ymin); for(i=0;i<k;i++)

{kx[i]=(x[i]-x[0]) *mx+win.Left;ky[i]= (ymax-y[i]) *my+win. Top;} Canvas->Brush->Color=clWhite; Canvas->Pen->Color=clBlack; Canvas->MoveTo(kx[0],ky[0J); for(i=l;i<k;i++)Canvas->LineTo(kx[i],ky[iJ); //строим график delete[] x; delete[] y; delete[] kx; delete[] ky;

302

6.4. Различие реализации объектных моделей C++, Delphi и C+ + Builder

}

void _ ja stca ll TDiagraml::Draw(char *stfloat xbfloat xefloat h)

{Canvas->Rectangle(win.Left,win. Top,win.Right,win.Bottom); TDiagram::Draw(st,xb,xe,h); //вызов родительского метода

}

#pragmapackage(smartinit)

Модуль FunctionUnit (описание класса MyFunction) : 1. Заголовок FunctionUnit.h

MfhdefFunctionUnitH

Mefine FunctionUnitH

struct Top { char Operation; float Value; Top *left, *rigth;}; class MyFunction

{private: char *string; Top *root;

unsigned int MainOperation(char *st, char *Op); void BuildTree(Top *r,char *st);

float FCount(Top *rfloat x,bool &key); void Del(Top *r);

public:

MyFunction(char ^formula); ~MyFunction();

float Counttfloat x,bool key);

};

#endif

2. Описание методов FunctionUnit.cpp

йinclude <string.h> #,include <stdlib.h> #include <math.h> #include <vcl.h> #pragma hdrstop #include "FunctionUnit.h"

unsigned int MyFunction::MainOperation(char *st, char *Op) { unsigned intj=0,k=0,i=0,p=0;

while ((i<strlen(st))&(p==0))

{ if (st[i]=='(')j++; else if (st[i]==')') k++;

else if ((j==k)&(strchr(Op,st[i])!=NULL))p=i; i++;

}

return p;

303

6. Объектная модель C+ + Builder

}

MyFunction::MyFunction(char formula)

{ root=new Top; string=new char[strlen(formula)+1J; strcpy(stringformula); BuildTree(rootformula); // строим дерево

}

void MyFunction::BuildTree(Top *r,char *st)

{ unsigned intpo,n; char stl[80J,str[80J;

po=MainOperation(st,

/ / ищем разделяющие операции «+» или «-»

if (ро-=0)po=MainOperation(st, "*/"); / / иначе «*» или «/»

if (pol-0) // если разделяющий знак найден, то строим вершину { r->Operation=st[poJ;

stmcpy(stl,st,po); stl[po]=’\0';

if ((stl[OJ=='(')&(MainOperation(stl, "+-*/")==())) //снимаем скобки {strncpy(stl,st+1,po-2); stlfpo-2] = '\0';}

n=strlen(st)-po-1; stmcpy(str,st+po+l,n); str[n]='\0';

if ((,str[0J== ’( ’)&(MainOperation(str, '+-*/")==0)) //снимаем скобки {strncpy(str,st+l,po-2); strfpo-2]='\0';}

r->left=new(Top); BuildTree(r->left,stl); // строим левое поддерево r->rigth=new(Top);BuildTree(r->rigth,str);//строим правое поддерево

}

else { r->left-NULL;r->rigth=NULL; if (st[0J=='x) r->Operation='x';

else {r->Operation='o';r->Value =atof(st);}

}

}

void MyFunction::Del(Top *r)

{ if (r->rigth!=NULL) Del(r->rigth); if (r->left!=NULL) Del(r->left); delete(r); }

MyFunction::~MyFunction()

{ delete[]string; if (root!=NULL)Del(root);} float MyFunction::FCount(Top *rfloat x.bool &key)

{ if (Ikey) return 0; switch (r->Operation)

{case 'o':return r-> Value; case 'x'.returnx;

case '+':return FCount(r->left,x,key)+FCount(r->rigth,x,key); case '-'.returnFCount(r->left,x,key)-FCount(r->rigth,x,key); case '*':returnFCount(r->left,x,key)*FCount(r->rigth,x,key); case '/': try {return FCount(r->left,x,key)/FCount(r->rigth,x,key);}

__ except (EXCEPTION EXECUTE_HANDLER){key=false;return 0;} default: {key=false; return 0;}

304

6.4. Различиереализации объектных моделей C++, Delphi и C++ Builder

}

}

float MyFunction::Count(float x,bool key) { return FCount(root,x,key);}

ttpragmapackage(smartJinit)

Вопросы для самоконтроля

1.Какие два типа классов реализованы в C++Builder и почему? В каких случаях необходимо использовать каждый из них?

2.Какие средства были включены в базовую объектную модель C++? Как их можно

использовать?

3.Почему в C++Builder три различных механизма обработки исключений? Расскажите о каждом из них. В каких случаях они используется ? Возможно ли их совместное применение?

4.Какие возможности реализованы в VCL-совместимых классах? Перечислите их и поясните, когда они могут быть использованы.

5.Назовите основные различия между механизмами реализации обычных и VCLсовместимых классов? Когда они проявляются?

6.Попробуйте самостоятельно (по аналогии с Delphi) создать приложение, которое генерирует сообщение и обрабатывает сообщение. Создайте в обработчике сообщения событие. Сравните полученную программу с программой примера 5.9. Поясните результаты.

ЗАКЛЮЧЕНИЕ

Существуют разные уровни программирования с применением ООП: можно просто использовать огромные библиотеки классов таких сред разра­ ботки программного обеспечения, как Delphy, C++ Builder или Visual C++, а можно изначально строить программу как дом, добавляя к ней все новые бло­ ки - объекты, для реализации которых Вам придется создавать свои классы.

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

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

СПИСОК ЛИТЕРАТУРЫ

Кглаве 1

1.Бадд Т. Объектно-ориентированное программирование в действии: Пер. с англ. СПб.: Питер, 1997. 464 с.

2. Буч Г. Объектно-ориентированный анализ и проектирование с примерами

приложений наС++: Пер. с англ. М.: Бином, СПб.: Невский диалект, 1998.

560 с.

Ъ.Дал У, Дейкстпра Э., КХоор. Структурное программирование: Пер. с англ.

М : Мир, 1975. 247 с.

4.ХьюзДж., МичтомДж. Структурный подход к программированию: Пер. с англ. М.: Мир, 1980. 278 с.

Кглаве 2

1.Поляков Д.Б., Круглов И.Ю. Программирование в среде Турбо-Паскаль (версия 5.5). М.: Изд-во МАИ, 1992. 576 с.

2.Фаронов В.В. Турбо-Паскаль в 3 кн. Кн. 1. Основы Турбо-Паскаля. М .: МВТУ

-Фесто Дидактик, 1992. 304 с.

Кглаве 3

1.Березин Б.И., Березин С.Б. Начальный курс С и C++. М.: Диалог-МИФИ, 1997. 288 с.

307

Список литературы

2.Вайнер Р., Пинсон Л. C++ изнутри: Пер. с англ. Киев: ДиаСофт; 1993. 304 с.

3.Лукас П. C++ под рукой: Пер. с а н т . Киев: ДиаСофт, 1993. 304 с.

4.Подбельский В.В. Язык Си++. М : Финансы и статистика, 1995. 560 с.

5.Скляров В.А. Язык C++ и объектно-ориентированное программирование. М.: Высш. шк., 1997. 478 с.

6. Страуструп Б. Язык программирования C++.: Пер. с англ. СПб.; М.: Невский

проспект - Изд-во БИНОМ, 1999. 991 с.

Кглаве 4

1.Колверт Ч Программирование в Windows’95. Освой самостоятельно: Пер.

сангл. М.: Воет, книжн. компания, 1996. 1008 с.

2.Персон Р. Windows 95 в подлиннике: Пер. с англ. СПб.: BHV-Санкт- Петербург, 1996. 736 с.

Кглаве 5

1.Епашенников AM ., Епашенников ^.^.Программирование в среде Delphi: В 4-х ч. М.: Диалог-МИФИ, 1997-98.

2. ЛишерР. Секреты Delphi 2: Пер. с англ. Киев: НИПФ ДиаСофтЛтд., 1996.

800с.

3.Марченко А.И. Программирование на языке Object Pascal 2.0. Киев: Юниор, 1998. 304 с.

4.МачтоД., ФолкнерД.Р Delphi: Пер. с англ. М.: Бином, 1995. 464 с.

5.Орлик С.В. Секреты Delphi на примерах: Версии 1.0 и 2.0. М.: Бином, 1996. 316с.

6. Фаронов В.В. Delphi 3. Учебный курс. М.: Нолидж, 1998. 400 с.

308

Список литературы

Кглаве 6

1.Елманова Н.З., Кошель С.П. Введение в Borland C++Builder. М.: ДиалогМИФИ, 1997. 272 с.

2.Рейсдорф К. Borland C++ Builder 3. Освой самостоятельно: Пер. с англ. М.: Бином, 1999. 736 с.

ПРЕДМ ЕТНЫ Й УКАЗАТЕЛЬ

Абстракция 19,21,23

Декомпозиция объекта 28 объектная 25, 50, 196,299 процедурная 11

Деструкторы виртуальные 76,152 простые 38,76, 110, 152

Дружественные функции 135

Инкапсуляция 20 Исключения 55, 251,273

генерация 56,254, 273 обработка 254,274 обработка завершающая 252, 278

Классы абстрактные 133,203 вложенные 108 иерархия 22, 35,41, 68, 255

контейнерные 20,63,123,205 локальные 52, 108, 161,223 определение 35, 59, 99,192 параметризованные 54, 154,

Композиция 45, 86

Конструкторы 38, 70, 110, 194,295 копирующие 114, 126, 146, 159 неинициализирующие 113, 151 переопределяемые 110

по умолчанию 151

Метаклассы 48, 219 Методы абстрактные 133, 203,144

виртуальные 69,130,202, 285 делегирование 49, 228, 263 динамические 202, 285 класса 222 перегруженные 207,262

переопределенные 42, 67, 129,162 полиморфные 42,67, 130,161 статические 109,285

Модульность 18,20

Наследование виртуальное 127,137 множественное 40, 125 простое 40,63,118 свойств 18

Наполнение 44, 86

Объекты динамические 77, 85,144 операции 34 переопределение типа 44,266 поведение 33 полиморфные 41, 70 предметной области 29 простые 60

с динамическими полями 77, 144 состояние 32 статические 38, 144

310