У меня есть запись, содержащая динамический массив. Это нормально, когда вы назначаете одну переменную массива другой, фактически назначается только указатель на этот массив. Это означает, что при этом обе переменные указывают на один и тот же массив, пока вы не измените размер одной из них. Поэтому, когда я хочу присвоить переменной отдельную копию массива, я использую функцию Copy ().
Однако в этом случае мой массив представляет собой поле записи:
TMyRec = record
Value: integer;
&Array: array of integer;
end;
Когда я объявляю две переменные типа TMyRec и затем назначаю одну другой, поля «Массив» в обеих записях будут указывать на один и тот же адрес в памяти.
Чтобы решить такую проблему, я решил перегрузить оператор присваивания следующим образом:
TMyRec = record
Value: integer;
&Array: array of integer;
public
class operator Implicit(Value: TMyRec): TMyRec;
end;
class operator TMyRec.Implicit(Value: TMyRec): TMyRec;
begin
Result := Value;
Result.&Array := Copy(Value.&Array);
end;
Если бы это сработало, мне не пришлось бы отдельно копировать все поля массива в моих записях после присвоения переменных TMyRecord друг другу.
Вот что я делаю:
var
Rec1, Rec2: TMyRec;
begin
Rec1.Value := 10;
SetLength(Rec1.Array, 1);
//I expected the "Implicit" method to be invoked here (but it is not...)
Rec2 := Rec1;
//if I do that, the Rec1.Array[0] will also be changed to 1 - I don't want that to happen
Rec2.Array[0] := 1;
end;
Есть ли способ заставить моего оператора работать так, как я хочу? Дело в том, что я пытаюсь перегрузить оператор присваивания по умолчанию. Разве это не возможно?