如何复制一个类的实例(50分)

  • 主题发起人 主题发起人 zhenghui
  • 开始时间 开始时间
Z

zhenghui

Unregistered / Unconfirmed
GUEST, unregistred user!
请问,如何复制一个类的实例!
 
type
TA=class
i,j:Integer;
Str:String;
end;
procedure CopyInstance(Src,Dest:TObject);
var
P0,P1:Pointer;
begin
DWord(P0):=DWord(Src)+4
//跳过vmt指针
DWord(P1):=DWord(Dest)+4;
Move(P0^,P1^,Src.InstanceSize-4)
//总的占用空间减去vmt指针的大小
end;
procedure TForm1.Button5Click(Sender: TObject);
var
A,B:TA;
begin
A:=TA.Create;
B:=TA.Create
//复制之前还要分配空间的
A.i:=123;
A.j:=456;
A.Str:='Hello!';
CopyInstance(A,B);
Caption:=Format('%d %d %s',[B.i,B.j,B.Str]);
A.Free;
B.Free;
end;
 
注意,上面的代码在退出的时候会产生一个异常,因为Str实际上只是一个指针,在释放A,B的时候
系统会两次释放同一个字符串,造成了错误。因此,对含有指针内容的对象进行Copy是很危险的。
如果改为不带指针的就很安全,没有任何问题:
type
TA=class
i,j:Integer;
end;
procedure TForm1.Button5Click(Sender: TObject);
var
A,B:TA;
begin
A:=TA.Create;
B:=TA.Create;
A.i:=123;
A.j:=456;
CopyInstance(A,B);
Caption:=Format('%d %d',[B.i,B.j]);
A.Free;
B.Free;
end;
 
不行!
我的类中不只有string还有动态数组,指针!
各位大侠!请帮帮忙!分数不够可以再加
 
有些类支持assign,他可以复制,其他的,不行
你自己的类,你自己可以实现assign方法,但是,你要在assign里面自己拷贝必要的成员
 
zhenghui:
这个问题早就讨论过了,何必浪费分数呢?
http://www.delphibbs.com/delphibbs/dispq.asp?lid=706176
 
我想要像楼上编的copyinstance类似的函数,
因为我编写的类有一部分是从TObject继承下来的,
assign是persistent的属性 ,只有继承它才能使用
 
to 斑竹:
斑竹帮我解决一下问题吧?要不还我分数
 
后退
顶部