gpt4 book ai didi

delphi - 你能重载 Delphi 记录的赋值运算符吗?

转载 作者:行者123 更新时间:2023-12-03 15:41:42 26 4
gpt4 key购买 nike

我有一条包含动态数组的记录。正常情况下,当您将一个数组变量分配给另一个数组变量时,实际上只分配了指向该数组的指针。这意味着,当您这样做时,两个变量都指向同一个数组,直到您更改其中一个变量的大小。因此,当我想将数组的单独副本分配给变量时,我使用 Copy() 函数。

但是,在这种情况下,我的数组是记录的一个字段:

  TMyRec = record
Value: integer;
&Array: array of integer;
end;

当我声明两个 TMyRec 类型的变量,然后将一个变量分配给另一个变量时,两个记录中的“Array”字段将指向内存中的同一地址。

为了解决此类问题,我决定重载分配运算符,如下所示:

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;

有没有办法让我的运算符(operator)重载按我想要的方式工作?问题是我试图重载默认的赋值运算符。这不可能吗?

最佳答案

您可以将数组放入实现接口(interface)的对象实例中,并将对该接口(interface)的引用存储在记录中。这样,当您尝试通过接口(interface)(从而通过对象)分配给数组时,它可以检查其引用计数并帮助实现写时复制语义。

或者,您可以使用类型不安全的技巧来找出数组的引用计数,如果存在多个引用,则在写入之前手动复制;但这将不受支持,并且如果动态数组实现发生更改就会中断。

wrote up如何实现包裹在记录中的写时复制数组结构。它是作为泛型类型实现的,但没有什么可以阻止您使用具体的数组类型,只是它不会那么通用。

关于delphi - 你能重载 Delphi 记录的赋值运算符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/953151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com