相关疑难解决方法(0)

你能为Delphi记录重载赋值运算符吗?

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

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

  TMyRec = record
    Value: integer;
    &Array: array of integer;
  end;
Run Code Online (Sandbox Code Playgroud)

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

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

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;
Run Code Online (Sandbox Code Playgroud)

如果这样可行,在将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 …
Run Code Online (Sandbox Code Playgroud)

delphi operator-overloading

3
推荐指数
1
解决办法
3087
查看次数

标签 统计

delphi ×1

operator-overloading ×1