Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Динамическое создание объектов




Для работы с динамическими объектами используется расширенный синтаксис процедур New и Dispose. Обе процедуры в этом случае содержат в качестве второ­го параметра имя конструктора или деструктора объекта:

New(P, Construct) или

Dispose(P, Destruct).

где Р — указатель на переменную объектного типа, a Construct и Destruct — конст­руктор и деструктор этого типа.

Действие процедуры New в случае расширенного синтаксиса равносильно дей­ствию операторов

New(P);

Р ^ .Construct;

а вызов процедуры Dispose эквивалентен последовательности

Р^.Destruct; Dispose(P);

Динамические объекты. Деструкторы

Для выделения памяти под объекты используются процедура и функция new.

На­пример, если определены указатели:

type

pmonstr = *monstr:

pdaemon = ^daemon; var pm: pmonstr; pd: pdaemon;

можно создать объекты с помощью вызовов:

new(pm); { или pm:= new(pmonstr); } new(pd); { или pd:= new(pdaemon); }

 

Обратите внимание, что при использовании new в форме процедуры параметром является указатель, а в функцию передается его тип. Так как после выделения памяти объект обычно инициализируют, в Паскале для удобства определены расширенные формы new с двумя параметрами. На месте второго параметра зада­ется вызов конструктора объекта:

new(pm, initd, 1, 1, 1);

{ или

pm:= new(pmonstr, initCl. 1, 1, 1));

} '

new(pd, initd, 1, 1, 1, 1):

{или

pd:= new(pdaemon. initd, 1, 1, 1, D);

}

Для освобождения памяти, занятой объектом, применяется процедура Dispose:

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

Для корректного освобождения памяти из-под полиморфных объектов следует использовать вместе с процедурой Dispose специальный метод — деструктор. Ему рекомендуется давать имя done, например:

destructor monstr.done:

begin

end:

Для правильного освобождения памяти деструктор записывается вторым пара­метром процедуры Dispose:

Dispose(pm, done);

Это верно только для виртуальных методов.

Для простых объектов деструктор может быть пустым, а для объектов, содержа­щих динамические поля, в нем записываются операторы освобождения памяти для этих полей. В деструкторе можно описывать любые действия, необходимые для конкретного объекта, например закрытие файлов. Исполняемый код деструк­тора никогда не бывает пустым, потому что компилятор по служебному слову destructor вставляет в конец тела метода операторы получения размера объекта из VMT. Деструктор передает этот размер процедуре Dispose, и она освобождает количество памяти, соответствующее фактическому типу объекта. (Вызов деструктора вне процедуры Dispose память из-под объекта не освобождает)

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

Ход работы:

Задание 1. Наберите и проанализируйте программу. Определите в данной программе все динамические объекты и методы применяемые к этим объектам. Объясните результаты выполнения программы.

program polivir;

uses Crt;

const

LENLIST=10; { длина списка }

type

 

TPerson = object

FName: string[30]; { имя }

FAddress: string[40]; { адрес }

constructor init(Name,Address:string);{ конструктор объекта }

destructor Done; virtual;{ деструктор объекта }

procedure print; virtual;

end;

 

TStudent = object(TPerson)

FGroup: integer; { учебная группа }

constructor init(Name,Address:string;Group:integer);

destructor Done; virtual;

procedure print; virtual;

end;

 

TProf = object(TPerson)

FKafedra: string[30]; { кафедра }

constructor init(Name,Address,Kafedra:string);

destructor Done; virtual;

procedure print; virtual;

end;

 

PStudent=^TStudent;

PProf=^TProf;

 

constructor TPerson.init(Name,Address:string);

begin

FName:=Name;

FAddress:=Address;

end;

 

destructor TPerson.Done;

begin

end;

 

procedure TPerson.print;

begin

writeln(FName);

writeln(FAddress);

end;

 

constructor TStudent.init(Name,Address:string;Group:integer);

begin

TPerson.init(Name,Address);

FGroup:=Group;

end;

 

destructor TStudent.Done;

begin

inherited Done; { вызов деструктора родительского типа }

end;

 

procedure TStudent.print;

begin

TPerson.print;

writeln('úα. ',FGroup);

end;

 

constructor TProf.init(Name,Address,Kafedra:string);

begin

TPerson.init(Name,Address);

FKafedra:=Kafedra;

end;

 

destructor TProf.Done;

begin

inherited Done;

end;

 

procedure TProf.print;

begin

TPerson.print;

writeln('K. ',FKafedra);

end;

 

var

list: array[1..LENLIST] of ^TPerson;

i:integer;

 

begin

{ инициализация списка }

for i:=1 to LENLIST do

list[1]:=NIL;

 

{ создать три объекта и поместить в список }

list[1]:=new(PStudent,init('Михаил Иванов','Лесной пр, д.29, корп.6ф, комн.211',3813));

list[2]:=new(PStudent,init('Цветков Станислав','пр. К.Маркса, д.32, кв.3',3813));

list[3]:=new(PProf,init('Некрасов Степан Петрович','Институтский пр., д.7, кв.13','Управление проектами'));

 

{ вывести объекты – элементы списка }

for i:=1 to LENLIST do

if list[i] <> NIL

then list[i]^.print;

 

{ уничтожить объекты }

for i:=1 to LENLIST do

if list[i] <> NIL

then

begin

Dispose(list[i],Done);

list[i]:=NIL;

end;

 

Readln;

 

end.

Задание для самостоятельного решения

Задание 2. Напишите программу, которая сначала формирует список, состоящий из объектов типа Tstudent и Tprof, затем, применяя метод print к элементам массива, выводит этот список на экран в алфавитном порядке.


Учреждение образования «Гомельский торгово-экономический колледж» Белкоопсоюза

  Рассмотрено на заседании цикловой комиссии «Информатики и программирования» Протокол № __ от «__»_____________2010 г. Председатель цикловой комиссии _______________________ Н.С. Васьковцова

 

ЛАБОРАТОРНАЯ РАБОТА №5

«Разработка программ с использованием стандартных объектов » »

 

По дисциплине «Объектно-ориентированное программирование»

Для групп П-21, П-22, П-23

 

специальность:

2-40 01 01 «Программное обеспечение информационных технологий»

специализация:

2-40 01 01 35 «Программное обеспечение обработки экономической и деловой информации»

2-40 01 01 33 «Компьютерная графика»

 

Разработала преподаватель

О.Л. Иткина

 

 

Гомель, 2010

Цель работы: научиться разрабатывать программы с использованием стандартных объектов

 

Ход работы:

 

Задание 1. Написать программу с использованием стандартных объектов, которая предлагает пользователю задать размер линейного массива, заполняет этот массив случайными целыми числами, выводит список элементов массива, а затем по выбору пользователя определяет минимальный и максимальный элементы массива, сумму всех элементов и количество положительных элементов.

(Разработку программ с использованием стандартных объектов рассмотрим на примере работы в объектно-ориентированной среде Delphi)

Создайте форму, для свойства Caption задайте значение «Создание и обработка массива». На форме разместите компоненты Edit1 и Edit2, кнопку Button1, для свойства Caption кнопки задайте значение «Создать массив». Разместите на форме панель GroupBox1, для свойства Caption которой задайте значение «Определить».

В панели GroupBox1 разместить компоненты CheckBox1, CheckBox2, CheckBox3 и CheckBox4, для свойства Caption которых задайте значения: «Минимальный элемент», «Максимальный элемент», «Сумма всех элементов», «Число положительных элементов», соответственно. Напротив них разместите компоненты Edit3, Edit4, Edit5, Edit6. Если компоненты CheckBox1, CheckBox2, CheckBox3 и CheckBox4 окажутся размещенными под панелью GroupBox1 и выбрать в контекстном меню команду ControlàSend to Back (ПорядокàНа задний план). В нижней чвсти формы разместить кнопку Button1 и задайте значение свойства Button1. Caption – «Вычислить». Удалите текст Edit1, Edit2, Edit3, Edit4, Edit5, Edit6 из соответствующих компонентов. Выровняйте компоненты на форме, как показано ниже на рисунке. Зафиксируйте положение компонентов на форме, выбрав в меню Delphi команду EditàLock Controls.

 

 

Сохраните файл проекта и программного модуля.

Прежде чем создавать обработчики событий щелчка мышью по кнопкам Button1 и Button2, в разделе описания переменных опишите переменные целого типа N и I, где N – размер массива, а I – порядковый номер элемента массива, а также М – динамический массив целых чисел.

Var

Form1: TForm1;

N, I: integer;

M: array of integer; {описание динамического массива целых чисел}

Для предупреждения ввода в окно Edit1 нечислового значения реализуем обработку события нажатия на клавишу в окне Edit1, чтобы запретить ввод любых символов, кроме цифр от 0 до 9. Для создания процедуры обработчика события нажатия на клавишу в окне Edit1 выберите в окне Инспектора объектов компонент Edit1 и на странице Events (События) дважды щелкните левой кнопкой мыши на пустом поле списка в событии OnKeyPress. После этого окно Редактора кода немедленно получит фокус и в разделе interface появится запись процедуры обработчика события:

Procedure Edit1KeyPress (Sender: Tobject; var Key: Char);

а в разделе implementation – текст заготовки этой процедуры:

Procedure Edit1KeyPress (Sender: Tobject; var Key: Char);

begin

end;

Вставьте в тело процедуры следующий оператор:

If not (Key in [‘0’.. ‘9’]) then Key:=#0;

Действие этого оператора сводится к сравнению значения переменной Key с множеством значений [‘0’.. ‘9’]. Если символ нажатой клавиши не входит в это множество, то Кеу присваивается значение нулевого символа (#0). Таким образом, в окне Edit1 будет отображаться текст, состоящий только из цифр.

Создание массива целых чисел опишите в процедуре обработчика события щелчком мышью на кнопке Button1. Для создания процедуры обработчика событий выберете в окне Инспектора объектов объект Button1, затем на странице События сделайте двойной щелчок на пустом поле списка в событии OnClick. После этого отредактируйте заготовку процедуры обработчика события procedure TForm1. Button1Click (Sender: TObject); в окне Редактора кода следующим образом:

Procedure TForm1. ButtonClick (Sender: Tobject);

begin

Randomize;

N:=StrToInt (Edit1.Text); {число элементов массива}

SetLength (M, N); {задать массиву М длину N}

Edit2. Text:=’ ‘; {очистить окно Edit2}

for I:=0 to N-1 do {заполнить массив случайными значениями целых чисел}

begin

M[I]:=Round (Sin (Random (100))*100); {присвоить элементу массива случайное значение}

Edit2. Text:=Edit2. Text+’ ‘+IntToStr (M[I]); {вывести элементы массива}

end;

end;

Обработку массива опишите в процедуре обработчика события щелчка мышью на кнопке Button2. для этого выберите в окне Инспектора объектов объект Button2, затем на странице События сделайте двойной щелчок на пустом поле списка в событии OnClick. После этого в окне Редактора кода в заготовку процедуры обработчика события procedure TForm1.Button2Click (Sender: TObject); в раздел описания локальных переменных поместите следующее описание:

var

Max, Min, Sum, CountPlus: integer; {результаты обработки массива}

где

Мах – максимальный элемент массива,

Min – минимальный элемент массива,

Sum – сумма всех элементов массива,

CountPlus – количество положительных элементов массива.

Обработку массива можно реализовать с помощью цикла For, в котором вычисление значения каждой из этих переменных записывается при помощи оператора if then, проверяющий условие CheckBox.Checked. Если свойство Checked имеет значение True, то выполняется вычисление соответствующей переменной. В заключительной части процедуры можно разместить вывод результатов обработки массива. Текст процедуры обработки массива может быть записан следующим образом:

Procedure TForm1.Button2Click (Sender: TObject); {обработка массива}

Var

Max, Min, Sum, CountPlus: integer; {результаты обработки массива}

begin

if CheckBox1.Checked then Min:=M[0]; {пусть 0-й элемент-Min}

Edit3.Text:=’ ‘;

if CheckBox2.Checked then Max:=M[0]; {пусть 0-й элемент-Max}

Edit4.Text:=’ ‘;

Sum:=0; {обнулить значение Sum}

Edit5.Text:=’ ‘;

CountPlus:=0; {обнулить значения суммы положительных элементов}

Edit6.Text:=’ ‘;

for I:=0 to N-1 do

begin

if CheckBox1.Checked then {определить минимальный элемент массива}

if Min>M[I] then Min:=M[I];

if CheckBox2.Checked then {определить максимальный элемент массива }

if Max<M[I] then Max:=M[I];

if CheckBox3.Checked then {суммировать элементы массива}

Sum:=Sum+M[I];

if CheckBox4.Checked then {суммировать положительные элементы массива}

if M[I]>0 then CountPlus:=CountPlus+1;

end;

{вывести результаты обработки массива}

if CheckBox1.Checked then Edit3.Text:=IntToStr (Min);

if CheckBox2.Checked then Edit4.Text:=IntToStr (Max);

if CheckBox3.Checked then Edit5.Text:=IntToStr (Sum);

if CheckBox4.Checked then Edit6.Text:=IntToStr (CountPlus);

end;

Сохраните файлы проекта и программного модуля, откомпилируйте и запустите программу на выполнение. Задавая различные значения числа элементов массива и щелкая мышью на кнопке Создать массив, убедитесь в правильной работе процедуры защиты от ввода нечисловых данных в Edit1 и генерации массива случайных целых чисел.

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

Закройте окно приложения.

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...