我有一个包含动态数组的记录。通常,当您将一个数组变量分配给另一个数组变量时,实际上只分配了指向该数组的指针。这意味着当您这样做时,两个变量都指向同一个数组,直到您更改其中一个变量的大小。因此,当我想将数组的单独副本分配给变量时,我使用 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;
有没有办法让我的运算符重载按我的意愿工作?问题是我试图重载默认赋值运算符。这不可能吗?