如何在Delphi中重载指定运算符以进行记录

时间:2013-07-31 20:05:27

标签: delphi operator-overloading assignment-operator

我想制作使用动态数组的记录类型。

使用此类型的变量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)指向相同的位置 记忆。
  2. 避免问题1)我想重载assign运算符 使用:

    类运算符TMyRec.Implicit(source:TMyRec):TMyRec;

  3. 但是编译器(Delphi XE)说:

    [DCC错误]:E2521运算符'隐式'必须在参数或结果类型中选择一个'TMyRec'类型

    如何解决这个问题。 我在stackoverflow上阅读了几篇类似的帖子,但是在我的情况下它们不起作用(如果我理解它们的话)。

    ARTIK

2 个答案:

答案 0 :(得分:5)

无法重载赋值运算符。这意味着您尝试做的事情是不可能的。

答案 1 :(得分:0)

唯一已知的方法是使用指针,这是不安全的,因此您必须了解自己在做什么。

是这样的:

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

呼叫示例应如下所示:

hits