Разработка классов на языке Object Pascal. Соколов Е.В. - 32 стр.

UptoLike

Составители: 

32
он создавал новый объект, значение кот орого совпадало бы со значением
self.comp[i], и именно его возвращал в качестве результата. Как нельзя
лучше для решения этой задачи подходит конструктор CreateEqualTo
класса Rational.
Пример 2.3.4. Н овая реализация метода GetComp.
function RVector.GetComp(i: Integer): Rational;
begin
if (i>=1) and (i<=Dim)
then result:=Rational.CreateEqualTo(self.comp[i])
else raise Exception.Create('Index is out of bounds');
end;
Оказывается далее, что кроме GetComp, SetComp и Assign совме-
щение адресов объектов производят также методы Plus и Minus. Но в
отл ичие от первых трех эти методы не «экономят» память, тиражируя
адреса на один и тот же объект, а наоборот , перерасходуют ее, допуская
утечку.
Количество объектов класса Rational, создаваемых в процессе ра-
боты каждого из них, вдвое превышает необходимое : первые Dim объек-
тов раз мещает в памяти конструктор Create класса RVector, вторые Dim
объектов появляются во время выполнения цикла как результат вызовов
метода Plus класса Rational. Оператор присваивания
result.comp[i]:=self.comp[i].Plus(v.comp[i]) as Rational;
подменяет адреса объектов в массиве result.comp, теряя при этом ссылки
на память, выделенную конструктором RVector.Create.
Самый простой способ избавления от лишних объектов заключа-
ется во введении вспомогательной переменной для временного хране-
ния адреса объекта, создаваемого методом Plus класса Rational, и ис -
пользовании метода Assign того же класса вместо оператора присваива-
ния. В результате для метода RVector.Plus мы получаем следующий код .
Пример 2.3.5. Вторая реализация метода Plus.
function RVector.Plus(v: RVector): RVector;
var i: Integer; temp: Rational;
begin
result:=RVector.Create;
for i:=1 to Dim do begin
temp:=self.comp[i].Plus(v.comp[i]) as Rational;
result.comp[i].Assign(temp);
он с оз д ав ал нов ы й объект, з начение которогос ов пад ал обы с оз начением
self.comp[i], и им енно его в оз в ращ ал в качес т в е рез ул ь т ат а. Как нел ь з я
л учше д л я решения этой з ад ачи под ход ит конс т руктор CreateEqualTo
кл ас с а Rational.

Пример2.3.4. Н ов ая реал из ац ия м етод а GetComp.

function RVector.GetComp(i: Integer): Rational;
begin
  if (i>=1) and (i<=Dim)
     then result:=Rational.CreateEqualTo(self.comp[i])
     else raise Exception.Create('Index is out of bounds');
end;


        О каз ы в ает с я д ал ее, чтокром е GetComp, SetComp и Assign с ов м е-
щ ение ад рес ов объектов произ в од ят т акже м етод ы Plus и Minus. Н о в
отл ичие от перв ы х т рех эт и м етод ы не «эконом ят » пам ят ь , т иражируя
ад рес а на од ин и тот же объект, а наоборот, перерас ход уют ее, д опус кая
ут ечку.
        Кол ичес т в ообъектов кл ас с а Rational, с оз д ав аем ы х в проц ес с е ра-
бот ы кажд огоиз них, в д в ое прев ы шает необход им ое: перв ы е Dim объек-
тов раз м ещ ает в пам ят и конс т руктор Create кл ас с а RVector, в торы е Dim
объектов появ л яют с я в ов рем я в ы пол нения ц икл а как рез ул ьт ат в ы з ов ов
м етод а Plus кл ас с а Rational. О ператор прис в аив ания
result.comp[i]:=self.comp[i].Plus(v.comp[i]) as Rational;
под м еняет ад рес а объектов в м ас с ив е result.comp, т еряя при этом с с ы л ки
на пам ят ь , в ы д ел енную конс т руктором RVector.Create.
         С ам ы й прос той с пос об из бав л ения от л ишних объектов з акл юча-
ет с я в о в в ед ении в с пом огат ел ь ной перем енной д л я в рем енного хране-
ния ад рес а объект а, с оз д ав аем ого м етод ом Plus кл ас с а Rational, и ис -
пол ь з ов ании м етод а Assign тогоже кл ас с а в м ес тооператора прис в аив а-
ния. В рез ул ьт ат е д л я м етод а RVector.Plus м ы пол учаем с л ед ующ ий код .

Пример2.3.5. Вторая реал из ац ия м етод а Plus.

function RVector.Plus(v: RVector): RVector;
var i: Integer; temp: Rational;
begin
  result:=RVector.Create;
  for i:=1 to Dim do begin
    temp:=self.comp[i].Plus(v.comp[i]) as Rational;
    result.comp[i].Assign(temp);



                                         32