Delphi记录副本构造函数

Delphi记录副本构造函数,delphi,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;

请看以下代码:

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.pa
指向
b.a
,而不是
a.a
。我该怎么做?输出将是

5 - 5
8 - 8
<>在C++中有(深度)复制构造函数来修复这个问题。在德尔福,这是一个不同的场景,但是否有“等价物”?我在文档中看到了操作员过载列表,但我无法找到正确的列表

有什么“等价物”吗


不,您必须编写自己的函数或方法,并显式调用它

我不知道你想实现什么,但也许函数可以帮上忙。复制按预期工作,不需要初始化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;
{$APPTYPE控制台}
使用
SysUtils;
类型
t测试=记录
a:整数;
功能pa:PInteger;
结束;
变量a,b:t试验;
函数TTest.pa:PInteger;
开始
结果:=@a;
结束;
开始
a、 a:=5;

//a.pa:=@a.a;我不知道在这个例子中,深层拷贝会有帮助。我想C++中的内容会是更深层次的任务而不是深度的文案,比如B.Apple(A)是我想避免的,但是它似乎是唯一的解决方案。一个记录构造函数能帮上忙吗?或者那无论如何都是不可能的?你必须调用它直到显式调用为止。好的,明白了,我会按照你在答案中给我的建议去做