ВУЗ:
Составители:
Рубрика:
31
Теперь новый объект создается перед каждым вызовом метода
SetComp, и, следовательно, все компоненты векторов находятся в раз -
ных областях памяти. Однако возникает новая проблема.
Метод Assign класса RVector также производит совмещение адре-
сов объектов , поэтому после инструкции v4.Assign(v2) соответственные
компоненты векторов v 2 и v 4 ссылаются на одно и то же место в памяти.
В результате вычитание v4.Subtract(v1) приводит к неявной модифика-
ции вектора v2, что и демонстрирует восьмая строка текста, в ы водимого
програм мой :
v2 after v4.Subtract(v1): (-1/2, -2/3, -3/4, -4/5, -5/6)
(вот для чего была нужна инструкция
WriteLn('v2 after v4.Subtract(v1): '+v2.AsString);
добавленная в демонстрационную программу еще в задаче 1.1).
Сложности возникают и при удалении векторов : деструктор об ъ -
екта v2 освобождает всю память, на которую ссылаются элементы масси-
ва comp объекта v4. Поэтому корректное завершение программы возмож -
но лишь в том случае, когда деструктор для вектора v4 не вызывается.
Если поведение метода SetComp еще можно считать допустимым
и учитывать при написании кода, то метод Assign работает явно неверно.
Стало быть, мы должны вернуться к реализации класса RVector и более
пристально изучить операции присваивания, выполняемые его м етодами.
Прежде всего, внесем изменения в методы GetComp, SetComp и
Assign. В последних двух из них вместо оператора присваивания мы мо-
жем использовать метод Assign класса Rational, осуществляющий кор -
рект ное копирование объекта.
Пример 2.3.3. Новая реализация методов SetComp и Assign.
procedure RVector.SetComp(i: Integer; value: Rational);
begin
if (i>=1) and (i<=Dim)
then self.comp[i].Assign(value)
else raise Exception.Create('Index is out of bounds');
end;
procedure RVector.Assign(v: RVector);
var i: Integer;
begin
for i:=1 to Dim do self.comp[i].Assign(v.comp[i]);
end;
Работу метода GetComp следует изменить таким образом , чтобы
Теперь нов ы й объект с оз д ает с я перед кажд ы м в ы з ов ом м етод а
SetComp, и, с л ед ов ат ел ь но, в с е ком понент ы в екторов наход ят с я в раз -
ны х обл ас тях пам ят и. О д наков оз никает нов ая пробл ем а.
М етод Assign кл ас с а RVector т акже произ в од ит с ов м ещ ение ад ре-
с ов объектов , поэтом у пос л е инс т рукц ии v4.Assign(v2) с оот в ет с т в енны е
ком понент ы в екторов v2 и v4 с с ы л ают с я на од нои тоже м ес тов пам ят и.
В рез ул ьт ат е в ы чит ание v4.Subtract(v1) прив од ит к неяв ной м од ифика-
ц ии в ектора v2, чтои д ем онс т рирует в ос ь м ая с т рока т екс т а, в ы в од им ого
програм м ой:
v2 after v4.Subtract(v1): (-1/2, -2/3, -3/4, -4/5, -5/6)
(в от д л я чегобы л а нужна инс т рукц ия
WriteLn('v2 after v4.Subtract(v1): '+v2.AsString);
д обав л енная в д ем онс т рац ионную програм м у ещ е в з ад аче 1.1).
С л ожнос т и в оз никают и при уд ал ении в екторов : д ес т руктор объ-
ект а v2 ос в обожд ает в с ю пам ят ь , на которую с с ы л ают с я эл ем ент ы м ас с и-
в а comp объект а v4. Поэтом у коррект ное з ав ершение програм м ы в оз м ож-
нол ишь в том с л учае, когд а д ес т руктор д л я в ектора v4 не в ы з ы в ает с я.
Е с л и пов ед ение м етод а SetComp ещ е м ожнос чит ат ь д опус т им ы м
и учит ы в ат ь при напис ании код а, том етод Assign работ ает яв нонев ерно.
С т ал обы т ь , м ы д ол жны в ернут ь с я к реал из ац ии кл ас с а RVector и бол ее
прис т ал ь ноиз учит ь операц ии прис в аив ания, в ы пол няем ы е егом етод ам и.
Прежд е в с его, в нес ем из м енения в м етод ы GetComp, SetComp и
Assign. В пос л ед них д в ух из них в м ес тооператора прис в аив ания м ы м о-
жем ис пол ь з ов ат ь м етод Assign кл ас с а Rational, ос ущ ес т в л яющ ий кор-
рект ное копиров ание объект а.
Пример2.3.3. Н ов ая реал из ац ия м етод ов SetComp и Assign.
procedure RVector.SetComp(i: Integer; value: Rational);
begin
if (i>=1) and (i<=Dim)
then self.comp[i].Assign(value)
else raise Exception.Create('Index is out of bounds');
end;
procedure RVector.Assign(v: RVector);
var i: Integer;
begin
for i:=1 to Dim do self.comp[i].Assign(v.comp[i]);
end;
Работу м етод а GetComp с л ед ует из м енит ь т аким образ ом , чтобы
31
Страницы
- « первая
- ‹ предыдущая
- …
- 29
- 30
- 31
- 32
- 33
- …
- следующая ›
- последняя »
