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)是我想避免的,但是它似乎是唯一的解决方案。一个记录构造函数能帮上忙吗?或者那无论如何都是不可能的?你必须调用它直到显式调用为止。好的,明白了,我会按照你在答案中给我的建议去做