不使用构造方法创建对象
C++里,New一个对象的时候,从堆内存里分配空间的同时会调用类的构造方法。而似乎Delphi并没有这样的用法:在Delphi里,New只是创建一个指针,GetMem也只能分配一块指定大小的堆内存并把起始地址交给指针变量。
如下,我想不调用Create方法,直接把一个同类型对象拷贝到GetMem的内存中去,但结果并不是太理想:
var
E, EOld : TEdit;
P, POld : Pointer;
procedure TForm1.Button1Click(Sender: TObject);
begin
EOld := TEdit.Create(self);// 我用Create方法创建一个TEdit对象
EOld.Parent := self;
EOld.Left := 2;
EOld.Top := 50;
EOld.Text := 'Old Edit ';
EOld.Show;
POld := @EOld;
ShowMessage(format( 'The Old Edit addr : %p ',[POld]));
GetMem(P,TEdit.InstanceSize);
CopyMemory(P, POld, TEdit.InstanceSize);//我把EOld拷贝到P指向的空间去
TEdit(P^).Left := TEdit(POld^).Left + 200;
TEdit(P^).Text := 'New Edit ';
ShowMessage(format( 'The New Edit addr : %p ',[P]));
//然而,此时EOld哪里去了?我相信其内存空间依然存在。并且,反复执行这个过程,将耗尽堆内存。然而,我该如何做,才能让EOld与P^同时可用?
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if P <> nil then FreeMem(P);
end;
[解决办法]
在C++中,对类进行new运算时,这时候new是重载的运算符, 实质就等效于DELPHI的建构方法Create
其实两者对象创建过程是大同小异的,主要区别DELPHI的对象统一在堆中分配而已.
在DELPHI中NEW含义同C++是有区别的.因为没有象C++中那样的运算符重载,这儿是单独的分配内存.
不是很明白楼主所想要的是什么...
你是想尝试复制对象呢?还是引用同一对象?
你的EOld为什么用后不释放掉呢?
[解决办法]
开玩笑,类是数据、方法、事件的定义混合体,对象是类的实体,多个同类对象,仅仅数据实体部分独立,方法、事件是相同的。
你能找到所有的数据么?包括公开、保护、私有?包括局部静态、动态开辟?
[解决办法]
可是可以,只不过对你创建的对象有一些要求. 在Delphi里, 类信息其实是一个内存空间, 应该是叫vmt, CREATE所有做的工作就是创建并给这个内存空间填上需要的数据.TObject有一个基础方法NewInstance.然后结合TComponent(因为这个才有流化类的功能)就可以创建出一个你需要的类了.具体可以看看Application.CreateForm这个方法.
[解决办法]
Application.CreateForm实质上还是调用了Create方法。
突然很想念一个人:sanmaotuo(老冯),呵呵。
[解决办法]
LZ是不是想自己写一个CLONE的方法?