有这样一个记录的数组:
TMyVertex2Array = array of TMyVertex2; // Объявление типа массива
TMyPolygon = record
Points: TMyVertex2Array;
class function New(aX1, aY1, aX2, aY2, aX3, aY3: Single): TMyPolygon; static;
// ... и еще куча полезных методов и операторов
procedure Offset(aX, aY: Single);
end;
代码中发生以下情况:
var
a, b: TMyPolygon;
begin
a := TMyPolygon.New(0,0,1,1,2,2);
b := a;
b.Offset(10, 10);
Assert(a.Points[0].X = 0); // <<-- Ошибка, т.к. изменился и массив а.Points
也就是说,从技术上讲,Delphi 复制了记录,但由于 数组只是一个指针,然后复制指针,数组本身保持不变(两条记录通用)。
如何利用Delphi的新特性,在b := a赋值Points((所谓的深拷贝)还是用另一种方式解决问题?
第一种方法:
第二种方法(在
SetLength动态数组上调用时,会自动生成副本):另一种方法是重新设计记录并明确突出显示具有适当行为的两种方法(更改和深拷贝):
并使代码如下: