看看这段代码:
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 ++中,有(深层)复制构造函数可以解决这个问题。在德尔福,这是一个不同的场景,但有什么东西"相当于"?我在doc中看过运算符重载列表,但是我找不到合适的列表。
答案 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)
有“等同”的东西吗?
没有。你必须编写自己的函数或方法,并明确地调用它。