2017-10-20 83 views
2

看看這段代碼:德爾福記錄拷貝構造函數

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 := ab.pa指向b.a而不是a.a。我怎樣才能做到這一點?輸出將是

​​

在C++中有(深)複製構造函數,可以解決此問題。在德爾福這是一個不同的場景,但有什麼「等價」?我在文檔中看到了運算符超載列表,但我無法找到合適的列表。

+1

我不確定深層複製對此示例有幫助。 –

+0

我想用C++來說,這將是一個更深層次的任務,而不是一個深層複製 –

回答

2

有什麼「等價」嗎?

不需要。你必須寫你自己的函數或方法,並明確地調用它。

+0

那麼像b.Copy(a)那樣的東西就是我想要避免的,但它似乎是唯一的解決方案。記錄構造函數可以幫助還是不可能呢? –

+0

你必須給它打電話 –

+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.