ВУЗ:
Составители:
Рубрика:
34
компоненты текущего вектора, адресуемого указателем self, копируются
в компоненты вект ора result, и лишь после этого к ним прибавляются
ком поненты вектора v.
И в том , и в другом случае, однако, полностью устранить избы-
точные действия не удается. Лишним по-прежнему является копиров а -
ние текущего вектора во вновь созданный, и избавиться от него можно,
только изменив саму процедуру создания вектора.
Здесь возможны по крайней мере два решения. Первое — доб а -
вить к классу RVector конс труктор , аналогичный Rational.CreateEqualTo
и создающий копию заданного вектора. Второе — реализовать возмож-
ность создания объекта класса RVector без размещения в памяти его
компонент и инициализ ации элементов массива comp их адресами. При
этом указанная возможность не должна предоставляться ни пользовате-
лю класса, ни клас су-наслед нику, поскольку они не имеют доступа к
полю comp и не смогут присвоить его элементам реальные значения
(старая версия метода SetComp позволяла это сделать, но мы решили от
нее отказаться). Таким образом , конструктор , создающий вектор оп и -
санным спос о бом , должен быть объявлен закрытым.
Реализ уем второй вариант. Новый конструктор будет называться
CreateEmpty и иметь следующий тривиальный код .
Пример 2.3.8. Реализация конструктора CreateEmpty.
constructor RVector.CreateEmpty;
begin
inherited Create;
end;
Методы Plus и Minus теперь возвращаются практически к своему
первоначальному виду.
Пример 2.3.9. Окончательная реализация методов Plus и Minus.
function RVector.Plus(v: RVector): RVector;
var i: Integer;
begin
result:=RVector.CreateEmpty;
for i:=1 to Dim do
result.comp[i]:=self.comp[i].Plus(v.comp[i]) as Rational;
end;
function RVector.Minus(v: RVector): RVector;
var i: Integer;
ком понент ы т екущ егов ектора, ад рес уем огоуказ ат ел ем self, копируют с я
в ком понент ы в ектора result, и л ишь пос л е этого к ним прибав л яют с я
ком понент ы в ектора v.
И в том , и в д ругом с л учае, од нако, пол нос т ь ю ус т ранит ь из бы -
точны е д ейс т в ия не уд ает с я. Л ишним по-прежнем у яв л яет с я копиров а-
ние т екущ егов ектора в ов нов ь с оз д анны й, и из бав ит ь с я от негом ожно,
тол ь коиз м енив с ам у проц ед уру с оз д ания в ектора.
Зд ес ь в оз м ожны по крайней м ере д в а решения. Перв ое — д оба-
в ит ь к кл ас с у RVector конс т руктор, анал огичны й Rational.CreateEqualTo
и с оз д ающ ий копию з ад анногов ектора. Второе — реал из ов ат ь в оз м ож-
нос т ь с оз д ания объект а кл ас с а RVector без раз м ещ ения в пам ят и его
ком понент и иниц иал из ац ии эл ем ентов м ас с ив а comp их ад рес ам и. При
этом указ анная в оз м ожнос т ь не д ол жна пред ос т ав л ят ь с я ни пол ь з ов ат е-
л ю кл ас с а, ни кл ас с у-нас л ед нику, пос кол ь ку они не им еют д ос т упа к
пол ю comp и не с м огут прис в оит ь его эл ем ент ам реал ь ны е з начения
(с т арая в ерс ия м етод а SetComp поз в ол ял а этос д ел ат ь , ном ы решил и от
нее от каз ат ь с я). Т аким образ ом , конс т руктор, с оз д ающ ий в ектор опи-
с анны м с пос обом , д ол жен бы т ь объяв л ен з акры т ы м .
Реал из уем в торой в ариант. Н ов ы й конс т руктор буд ет наз ы в ат ь с я
CreateEmpty и им ет ь с л ед ующ ий т рив иал ь ны й код .
Пример2.3.8. Реал из ац ия конс т руктора CreateEmpty.
constructor RVector.CreateEmpty;
begin
inherited Create;
end;
М етод ы Plus и Minus т еперь в оз в ращ ают с я практ ичес ки к с в оем у
перв оначал ь ном у в ид у.
Пример2.3.9. О кончат ел ь ная реал из ац ия м етод ов Plus и Minus.
function RVector.Plus(v: RVector): RVector;
var i: Integer;
begin
result:=RVector.CreateEmpty;
for i:=1 to Dim do
result.comp[i]:=self.comp[i].Plus(v.comp[i]) as Rational;
end;
function RVector.Minus(v: RVector): RVector;
var i: Integer;
34
Страницы
- « первая
- ‹ предыдущая
- …
- 32
- 33
- 34
- 35
- 36
- …
- следующая ›
- последняя »
