У меня есть запись, которая содержит динамический массив. Обычно, когда вы присваиваете одну переменную массива другой, фактически присваивается только указатель на этот массив. Это означает, что когда вы делаете это, обе переменные указывают на один и тот же массив, пока вы не измените размер одной из них. Поэтому, когда я хочу назначить отдельную копию массива переменной, я использую функцию 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;
Есть ли способ заставить перегрузку моего оператора работать так, как я хочу? Дело в том, что я пытаюсь перегрузить оператор присваивания по умолчанию. Разве это не возможно?