ВУЗ:
Составители:
Рубрика:
39
И , наконец , еще один метод может стать источником теперь уже
потенциальной утечки памяти. Речь идет о конструкторе Create.
Вспомним , что в Object Pascal конструктор м ожет быть вызван не
только для создания нового объекта, но и для переинициализации сущ е-
ствующего. Наш конструктор Create при этом просто разместит заново
все компоненты вектора, напрочь забыв об уже существующих объек-
тах. Чтобы исключить такую возможность, добавим к коду конструктора
проверку на равенство указателя нулю (т. е. в данном случае nil). Если
компонента существует, ее нужно не размещать в памяти заново, а лишь
переинициализировать повторным вызовом конструктора Rational.Create.
Пример 2.3.13. Окончательная реализация конструктора Create.
constructor RVector.Create;
var i: Integer;
begin
inherited Create;
for i:=1 to Dim do
if self.comp[i]<>nil then self.comp[i].Create
else self.comp[i]:=Rational.Create;
end;
В заключение решения данной задачи отметим , что приведенный
выше код демонстрирует объектное , но не объектно-ориентированное
программирование. Хотя формально элементы массива comp и парамет-
ры методов класса RVector имеют тип Rational, в действительности они
мог ут содержать адреса объектов , принадлежащих любым классам , про-
из вод ным от Rational. В этом случае и результат, скажем , операции Sca-
larProduct также не обязан принадлежать классу Rational. Следов а тельно,
мы не можем создать переменную result вызовом конс труктора, явно
указав имя данного класса. Более подробное обсуждение этих вопросов
отл ожим до задачи 3.1.
Задача 2.4 является обобщением предыдущей. Требуется изме-
нить класс RVector так, чтобы его объекты представляли векторы прои з -
вольной размерности и эт а размерность могла изменяться пользователем
класса.
Решение. 1. Чтобы подчеркнуть основное отличие данного клас-
са от предыдущего, назовем его DynamicRVector.
2. Поскольку размерность вектора согласно условию задачи м ожет
И , наконец , ещ е од ин м етод м ожет с т ат ь ис точником т еперь уже
пот енц иал ь ной ут ечки пам ят и. Речь ид ет оконс т рукторе Create.
Вс пом ним , чтов Object Pascal конс т руктор м ожет бы т ь в ы з в ан не
тол ь код л я с оз д ания нов огообъект а, нои д л я переиниц иал из ац ии с ущ е-
с т в ующ его. Н аш конс т рукт ор Create при этом прос тораз м ес т ит з анов о
в с е ком понент ы в ектора, напрочь з абы в об уже с ущ ес т в ующ их объек-
т ах. Ч тобы ис кл ючит ь т акую в оз м ожнос т ь , д обав им к код у конс т руктора
пров ерку на рав енс т в о указ ат ел я нул ю (т. е. в д анном с л учае nil). Е с л и
ком понент а с ущ ес т в ует, ее нужноне раз м ещ ат ь в пам ят и з анов о, а л ишь
переиниц иал из иров ать пов торны м в ы з ов ом конс т руктора Rational.Create.
Пример2.3.13. О кончат ел ь ная реал из ац ия конс т руктора Create.
constructor RVector.Create;
var i: Integer;
begin
inherited Create;
for i:=1 to Dim do
if self.comp[i]<>nil then self.comp[i].Create
else self.comp[i]:=Rational.Create;
end;
В з акл ючение решения д анной з ад ачи от м ет им , чтоприв ед енны й
в ы ше код д ем онс т рирует объект ное, но не объект но-ориент иров анное
програм м иров ание. Х отя форм ал ь ноэл ем ент ы м ас с ив а comp и парам ет -
ры м етод ов кл ас с а RVector им еют т ип Rational, в д ейс т в ит ел ь нос т и они
м огут с од ержат ь ад рес а объектов , принад л ежащ их л юбы м кл ас с ам , про-
из в од ны м от Rational. В этом с л учае и рез ул ьт ат, с кажем , операц ии Sca-
larProduct т акже не обяз ан принад л ежат ь кл ас с у Rational. С л ед ов ат ел ь но,
м ы не м ожем с оз д ат ь перем енную result в ы з ов ом конс т руктора, яв но
указ ав им я д анногокл ас с а. Бол ее под робное обс ужд ение эт их в опрос ов
отл ожим д оз ад ачи 3.1.
Задача 2.4 яв л яет с я обобщ ением пред ы д ущ ей. Требует с я из м е-
нит ь кл ас с RVector т ак, чтобы егообъект ы пред с т ав л ял и в екторы произ -
в ол ь ной раз м ернос т и и эт а раз м ернос т ь м огл а из м енят ь с я пол ь з ов ат ел ем
кл ас с а.
Реш ение. 1. Ч тобы под черкнут ь ос нов ное отл ичие д анногокл ас -
с а от пред ы д ущ его, наз ов ем егоDynamicRVector.
2. Пос кол ь ку раз м ернос т ь в ектора с огл ас ноус л ов ию з ад ачи м ожет
39
Страницы
- « первая
- ‹ предыдущая
- …
- 37
- 38
- 39
- 40
- 41
- …
- следующая ›
- последняя »
