如何实现对象的复制(50分)

  • 主题发起人 主题发起人 创意人生
  • 开始时间 开始时间

创意人生

Unregistered / Unconfirmed
GUEST, unregistred user!
我自定义了一个类 BI = class(TObject),然后建立了一个对象BI1,现在另外建立了一个对象BI2,请问如何把BI1里面的数据复制到BI2里面。
TStringList里面用Assign可以复制数据,但BI里面并没有继承Assign这个方法,请高手提示。
 
把TObject 换成别的类 下级类
 
将BI1中的属性逐个赋值给BI2
 
TObject没有CLONE方法
可以用内存复制的方式来实现

type
TTest = class(TObject)
aa: Integer;
end;
pTest = ^TTest;

procedure TForm1.Button2Click(Sender: TObject);
var
test1, test2: TTest;
pTest1, pTest2: pTest;
begin
test1 := TTest.Create;
test1.aa := 10;
pTest1 := @test1;
test2 := TTest.Create;
pTest2 := @test2;
CopyMemory(pTest2, pTest1, SizeOf(test1));
ShowMessage(IntToStr(test2.aa));
end;
 
japhe我认为你的方法是错的
证明如下
type
TTest = class(TObject)
aa: string;//不要使用Integer,Integer是简单类型,没有说服性
end;
pTest = ^TTest;

procedure TForm1.Button2Click(Sender: TObject);
var
test1, test2: TTest;
pTest1, pTest2: pTest;
begin
test1 := TTest.Create;
test1.aa := '10';
pTest1 := @test1;
test2 := TTest.Create;
pTest2 := @test2;
CopyMemory(pTest2, pTest1, SizeOf(test1));
//这里在你的代码基础上添加一行代码
test1.Free;
ShowMessage(test2.aa);
end;
若没有test1.Free,那么编译没有问题
如果你的代码实现要求,那么因为test1和test2没有任何关系
所以test1.Free执行之后
ShowMessae(test2.aa)依然可以执行
事实上在test1.Free后执行
ShowMessae(test2.aa)出错
说明你复制的只是指针,而不是真实的内存
 
哦,受教了。
 
各位,是不是除了对数据和属性逐一复制,就没有其他办法了。是不是在机制上本来就没有机会。我看StringList的Assgin代码也是逐一复制的。
 
结贴散分
 
后退
顶部