如何将一个对象的值赋给另一个对象??

时间:2022-01-12 16:47:37

A,B:TUserDefine;

A:=TUserDefine.create;
B:=TUserDefine.create;

A.xxx:=...
A.YYY:=...
...


如何使把A的值赋给B。
用B:=A不行,
等于B为A的引用,这样当A.free后再B.free就出错。
我记得动态数组也存在这种情况,所以动态数组互相赋值用aryB:=Copy(aryA);
但对对象不行。请问如何解决。。。。。。。

21 个解决方案

#1


B.Assign(A);

#2


可是TUserDefine 没有Assign方法。又该如何????

#3


Move(const Source; var Dest; Count: Integer);
行吧

#4


move不行,释放B时出错

#5


我加到100分了

#6


怎么没人来了。都100分了

#7


找到一个函数
VOID CopyMemory (
    PVOID Destination, // address of copy destination 
    CONST VOID *Source, // address of block to copy 
    DWORD Length  // size, in bytes, of block to copy  
   );
这样应该没问题
CopyMemory(B, A, A.InstanceSize);

#8


以前我们就讨论过,除非设计者提供或派生了Assign()方法,
否则,没法对对象进行互为赋值,Move与Copy都不行,因为一个
对象中往往有动态申请的单元或属性以及指针等,情况很复杂,
简单地赋值是不行的,答案的结果就是没有通用的方法.


#9


同样BCB的,我也认为只能一个变量,一个变量的赋值。

#10


BCB回答正确。

#11


xzgyb
我用了你的方法,死机两次,都不知道是怎么死的。
请问BCB,Assign方法应该怎么写,VCL中哪个类的可以参考??

#12


从TCollectionItem继承的子类都完成了Assigned方法。你随便找个看看吧。
比如在DB单元中的TFieldDef

#13


关注

#14


gz

#15


 如果类赋值的话,最好要继承assign方法,以便释放,否则自己要添加释放的方法

#16


Assign()是类设计者设计的,他自已知道应怎样复制一个类(其实也就是复制一些类的属性而已),
但他不一定提供Assign(),类的每一次派生都要重新扩充Assign(),所以,
你想再设计一个Assign通用办法很困难,你只好将每个对象的属性都赋值一下,可一般人
又不愿这样做.



#17


欧,不好意思,我自己瞎试的
我是简单用个类
interface

TFA = Class
  public
    FI,FJ:Integer;
    procedure PrintI;
end;
implement
procedure TFA.PrintI;
begin
  ShowMessage(IntToStr(FI));
end;

procedure TForm1.ButtonClick(Sender:TObject);
var
  I, J : TFA;
begin
  I := TFA.Create;
  J := TFA.Create;
  I.FI := 23;
  CopyMemory(J, I, I.InstanceSize);
  J.PrintI;
  I.Free;
  J.PrintI;
  J.Free;
end;
end.
运行没有错误啊,也没有死机,我不知为什么

#18


我不认为拷贝内存就可以解决问题。你上面给的例子很简单。如果类中存在复杂的对象,拷贝内存无非就是拷贝个地址而已,没有真正的拷贝对象。
此外,诸如string这种Delphi维护的动态类型,拷贝内存并不能导致其RefCount自增1,如果释放掉原来的对象,新的对象肯定也要出问题。

#19


ok,明白了,没有考虑太多

#20


没有办法!

#21


给分了!!

#1


B.Assign(A);

#2


可是TUserDefine 没有Assign方法。又该如何????

#3


Move(const Source; var Dest; Count: Integer);
行吧

#4


move不行,释放B时出错

#5


我加到100分了

#6


怎么没人来了。都100分了

#7


找到一个函数
VOID CopyMemory (
    PVOID Destination, // address of copy destination 
    CONST VOID *Source, // address of block to copy 
    DWORD Length  // size, in bytes, of block to copy  
   );
这样应该没问题
CopyMemory(B, A, A.InstanceSize);

#8


以前我们就讨论过,除非设计者提供或派生了Assign()方法,
否则,没法对对象进行互为赋值,Move与Copy都不行,因为一个
对象中往往有动态申请的单元或属性以及指针等,情况很复杂,
简单地赋值是不行的,答案的结果就是没有通用的方法.


#9


同样BCB的,我也认为只能一个变量,一个变量的赋值。

#10


BCB回答正确。

#11


xzgyb
我用了你的方法,死机两次,都不知道是怎么死的。
请问BCB,Assign方法应该怎么写,VCL中哪个类的可以参考??

#12


从TCollectionItem继承的子类都完成了Assigned方法。你随便找个看看吧。
比如在DB单元中的TFieldDef

#13


关注

#14


gz

#15


 如果类赋值的话,最好要继承assign方法,以便释放,否则自己要添加释放的方法

#16


Assign()是类设计者设计的,他自已知道应怎样复制一个类(其实也就是复制一些类的属性而已),
但他不一定提供Assign(),类的每一次派生都要重新扩充Assign(),所以,
你想再设计一个Assign通用办法很困难,你只好将每个对象的属性都赋值一下,可一般人
又不愿这样做.



#17


欧,不好意思,我自己瞎试的
我是简单用个类
interface

TFA = Class
  public
    FI,FJ:Integer;
    procedure PrintI;
end;
implement
procedure TFA.PrintI;
begin
  ShowMessage(IntToStr(FI));
end;

procedure TForm1.ButtonClick(Sender:TObject);
var
  I, J : TFA;
begin
  I := TFA.Create;
  J := TFA.Create;
  I.FI := 23;
  CopyMemory(J, I, I.InstanceSize);
  J.PrintI;
  I.Free;
  J.PrintI;
  J.Free;
end;
end.
运行没有错误啊,也没有死机,我不知为什么

#18


我不认为拷贝内存就可以解决问题。你上面给的例子很简单。如果类中存在复杂的对象,拷贝内存无非就是拷贝个地址而已,没有真正的拷贝对象。
此外,诸如string这种Delphi维护的动态类型,拷贝内存并不能导致其RefCount自增1,如果释放掉原来的对象,新的对象肯定也要出问题。

#19


ok,明白了,没有考虑太多

#20


没有办法!

#21


给分了!!