首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

不使用构造方法创建对象解决方案

2012-02-27 
不使用构造方法创建对象C++里,New一个对象的时候,从堆内存里分配空间的同时会调用类的构造方法。而似乎Delp

不使用构造方法创建对象
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的方法?

热点排行