Delphi记录拷贝构造函数

时间:2017-10-20 16:00:16

标签: delphi

看看这段代码:

type
 TTest = record
  a: integer;
  pa: PInteger;
 end;

procedure TForm1.Button1Click(Sender: TObject);
var a, b: ttest;
begin

 memo1.Clear;

 a.a := 5;
 a.pa := @a.a;

 Memo1.Lines.Add(a.a.ToString + ' - ' + (a.pa)^.ToString);

 b := a;
 b.a := 8;

 Memo1.Lines.Add(b.a.ToString + ' - ' + (b.pa)^.ToString);

end;

输出如下:

5 - 5
8 - 5

这是正确的,但不是我所期望的。当我说b := a时,它会将a的每个字段复制到b中。因此,a.pa := @a.a;当然b.pa将与a.pa相同。

相反,我希望在我b := a b.pab.a而不是a.a时,我需要这样做。我怎样才能做到这一点?输出将是

5 - 5
8 - 8

在C ++中,有(深层)复制构造函数可以解决这个问题。在德尔福,这是一个不同的场景,但有什么东西"相当于"?我在doc中看过运算符重载列表,但是我找不到合适的列表。

2 个答案:

答案 0 :(得分:4)

我不知道你想要实现什么,但也许一个功能可以提供帮助。复制按预期工作,不需要初始化 pa 。限制是,您不能再设置 pa

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type
 TTest = record
  a: integer;
  function pa: PInteger;
 end;

var a, b: TTest;

function TTest.pa: PInteger;
begin
  Result := @a;
end;

begin
 a.a := 5;
// a.pa := @a.a; <- this is not needed anymore but also not possible

 WriteLn(IntToStr(a.a) + ' - ' + IntToStr((a.pa)^));

 b := a;
 b.a := 8;

 WriteLn(IntToStr(b.a) + ' - ' + IntToStr((b.pa)^));
 ReadLn;
end.

答案 1 :(得分:2)

  

有“等同”的东西吗?

没有。你必须编写自己的函数或方法,并明确地调用它。