如何在 Delphi 中重载记录赋值运算符

bvjxkvbb  于 2023-11-18  发布在  其他
关注(0)|答案(2)|浏览(129)

我想创建使用动态数组的记录类型。
使用这种类型的变量A和B,我希望能够执行操作A:= B(和其他操作),并且能够修改A的内容而不修改B,如下面的代码片段所示:

type
      TMyRec = record
        Inner_Array: array of double;
      public
        procedure SetSize(n: integer);
        class operator Implicit(source: TMyRec): TMyRec;
      end;

    implementation

    procedure TMyRec.SetSize(n: integer);
    begin
      SetLength(Inner_Array, n);
    end;

    class operator TMyRec.Implicit(source: TMyRec): TMyRec;
    begin
    //here I want to copy data from source to destination (A to B in my simple example below)
    //but here is the compilator error
    //[DCC Error] : E2521 Operator 'Implicit' must take one 'TMyRec' type in parameter or result type
    end;

    var
      A, B: TMyRec;
    begin
      A.SetSize(2);
      A.Inner_Array[1] := 1;
      B := A;
      A.Inner_Array[1] := 0;
//here are the same values inside A and B (they pointed the same inner memory)

字符串
有两个问题:
1.当我不在我的TMyRec中使用覆盖赋值运算符时,A:=B意味着A和B(它们的Inner_Array)指向内存中的同一个位置。
1.为了避免问题1)我想重载赋值运算符,使用:
类运算符TMyRec.隐式(源:TMyRec):TMyRec;
但是编译器( Delphi XE)说:
[DCC错误]:E2521运算符“隐式”在参数或结果类型中必须采用一个“TMyRec”类型
如何解决这个问题。我读了几篇类似的关于stackoverflow的文章,但是它们对我的情况不起作用(如果我很好地理解的话)。
Artik

7d7tgy0s

7d7tgy0s1#

不可能重载赋值运算符。这意味着您试图做的事情是不可能的。
编辑:现在可以了-http://docwiki.embarcadero.com/RADStudio/Sydney/en/Custom_Managed_Records#The_Assign_Operator

e7arh2l6

e7arh2l62#

唯一已知的方法是使用指针,这是不安全的,所以你必须明白你在做什么。
大概是这样的

type
  PMyRec = ^TMyRec;
  TMyRec = record
    MyString : string;
    class operator Implicit(aRec : PMyRec) : TMyRec;
  end;
....
class operator TMyRec.Implicit(aRec : PMyRec) : TMyRec;
begin
  if aRec = nil then // to do something...
    raise Exception.Create('Possible bug is here!');
  Result.MyString := aRec^.MyString;
end;

字符串
调用示例应该如下所示:

var
  aRec1, aRec2 : TMyRec;
begin
  aRec1.MyString := 'Hello ';
  aRec2.MyString := 'World';
  writeln(aRec1.MyStr, aRec2.MyStr);
  aRec2 := @aRec1;
  writeln(aRec1.MyStr, aRec2.MyStr);
end.

相关问题