我有一个包含动态数组的记录。当您将一个数组变量分配给另一个数组时,通常只分配指向该数组的指针是很正常的。这意味着当你这样做的时候,两个变量指向相同的数组,直到你改变其中一个变量的大小。因此,当我想将一个数组的单独副本分配给一个变量时,我使用Copy()函数。您是否可以重载Delphi记录的赋值运算符?
在这种情况下,然而,我的阵列是记录的字段:
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;
有没有办法让我的运算符重载的工作,我希望它?事情是,我试图超载默认赋值运算符。这不可能吗?
[是的,在某种程度上(https://stackoverflow.com/a/47320631/7579632),如果你愿意滥用语言。 – 2017-11-16 12:28:03