Delphi:Create()构造函数末尾的访问冲突

Delphi:Create()构造函数末尾的访问冲突,delphi,delphi-xe2,Delphi,Delphi Xe2,我有一个非常基本和简单的类,如下所示: procedure TForm1.Button1Click(Sender: TObject); var the : TLoader; begin the := the.Create; end; 单元装载机 interface uses Vcl.Dialogs; type TLoader = Class(TObject) published constructor Create(); end; implementat

我有一个非常基本和简单的类,如下所示:

procedure TForm1.Button1Click(Sender: TObject);
var
 the : TLoader;
begin
  the := the.Create;
end;
单元装载机

interface

uses
  Vcl.Dialogs;

type
  TLoader = Class(TObject)
  published
      constructor Create();
  end;

implementation

{ TLoader }    
constructor TLoader.Create;
begin
   ShowMessage('ok');

end;

end.
从表格1我这样称呼它:

procedure TForm1.Button1Click(Sender: TObject);
var
 the : TLoader;
begin
  the := the.Create;
end;
现在,就在
the:=the.Create
部分之后,delphi显示了带有
'ok'
的消息,然后给我一个错误,并说
Project Project1.exe引发了异常类$C0000005,消息是“0x0040559d处的访问冲突:读取地址0xFFFFFFFe4”。

它还显示了这一行:

constructor TLoader.Create;
begin
   ShowMessage('ok');

end; // <-------- THIS LINE IS MARKED AFTER THE ERROR.
构造函数TLoader.Create;
开始
ShowMessage('ok');
完
这是不正确的。应该是

var
  the : TLoader;
begin
  the := TLoader.Create;

你的语法错了。如果要构造新对象,则应在构造函数调用中使用类名,而不是变量名:

procedure TForm1.Button1Click(Sender: TObject);
var
 the : TLoader;
begin
  the := TLoader.Create;
end;

我应该睡几个小时:(我怎么会错过这一点!谢谢你问题解决了!谢谢:)@xangr-别担心。这是德尔福经典。我已经记不清做过多少次了。您应该使用.ClassType().Create();:-))马丁:我相信你应该打电话给我;也很烦人,但这会让你在未来的both Delphi RTL内核重构和你自己的代码中更加自我。不,你不能这么做,@Arioch。
ClassType
函数通过从给定对象读取类引用来工作。在您的建议中,
ClassType
将从未初始化的变量读取,因为还没有有效的对象引用,这与原始问题面临的问题相同
ClassType
是一个实例方法,所以你需要一个实例。你在说什么,@Arioch?虚拟构造函数与此无关。<代码> ClassType < /C>函数在C++ Builder中与Delphi中的工作原理相同;表达式< > > -> CasStasePe()/<代码>未初始化的<代码> < /COD>变量与C++一样,在Delphi中也是错误的。在C++中,你认为这是一个捷径?C++不允许你直接调用任何< < ClasssType > /COD>返回的构造函数;不起作用的代码不是捷径。我不知道
var实例:TLoader
应该做什么。您确定需要该全局变量吗?您似乎打算声明本地
t加载程序
变量。问题不是“如何声明类”。这是德尔福抛出的一个例外,我没有意识到它来自错误的声明。:)@我的评论并不是针对你的。这是一个明显的重复。我肯定我已经回答过不止一次了。我相信安德烈亚斯和梅森也有。但我不能很快找到一个问题来说明这一点。“堆栈溢出搜索并不是很好,但我怀疑这是一个非常困难的问题。很难找到这个问题的重复项,@David,因为很难笼统地问这个问题。”。我们已经看到了许多潜在问题的实例,但每次都会以“调试我的代码”问题的形式出现,因为这是从一个还不知道问题出在哪里的人的角度来表述问题的唯一方法。Xangr,编译器没有警告您使用了未初始化的变量吗?