假设我们有以下结构(1):
type
PNode = ^TNode;
TNode = class(object)
...
end;
那些。类型化类指针
和结构(2):
type
TNode = class;
TNodeClass = class of TNode;
TNode = class(object)
...
end;
TNodeClass 本质上是指向给定类的相同指针吗?它基本上是同一件事,是同一件事的一些新旧记录(因为第一种方法经常在旧书中找到,而第二种方法经常在更现代的资料中出现)还是我误解了什么?根本区别是什么以及如何使用一个和另一个?
第一个是指向对象实例的指针,这基本上是一个无用的东西。该实例本身已经是一个指针。(也许这是对旧类型对象的某种暗示)
第二个是类引用、类的类或元类。
在 Delphi 内部广泛用于类工厂- 使用类引用创建具体类的实例。
最常见的例子是
Application.CreateForm
例如,
TForm1
有一个类型为 的元类(类引用)的实例TFormClass
。并且Form1
有一个类的实例(具体对象)TForm1
。编译器使用元类创建表单对象。每个 VCL 项目中的默认代码带有一个表单(dpr,菜单 Project-View Source):请注意,执行此操作的代码不知道存在
TForm1
,TMainForm
以及我们可能希望编写的其他形式。要使用类方法,类构造函数,正如@Igor 指出的那样,必须是虚拟的,在 VCL 对象层次结构中以
TPersistent
.您可以手动实例化表单并使用构造函数显式创建它
TForm1
。FindClass/GetClass
甚至允许您使用字符串类名来获取元类(如果元类存在且已注册)Pro
class of
写了@MBo。类工厂的关键点是虚拟构造函数的存在。但是关于指针。
嗯,不,没有人成为
nil
。该呼叫.Free
不会重置任何内容。两个变量都指向同一个释放内存的区域。这是真的。
FreeAndNil(a);
释放内存后,将值а
分配给变量nil
。但是变量b
继续指向被破坏对象所在的内存位置。这块内存区域被认为是“空闲的”,可以随时被覆盖。但有一段时间它仍然会包含被破坏对象的数据。