delphi - 为什么Delphi XE3给出 "E2382 Cannot call constructors using instance variables"?

标签 delphi object constructor

我有一段简单的代码,可以在 Delphi XE2 中编译,但不能在 XE3 中编译,我不知道为什么。我已将有问题的代码减少到一小部分,并想知道 Delphi 认为它有什么问题。尝试在 Delphi XE 2 中编译包含此单元的项目工作正常,但在 Delphi XE3(试用版)中,它会给出“[dcc32 Error] AffineTransform.pas(26): E2382 Cannot call constructors using instance variables”。我所知道的唯一“古怪”的事情是使用老式的“对象”类型,其中构造函数与真实对象(基于 TObject 的类实例)中的构造函数并不完全相同。

如果我用“过程”替换该对象中的“构造函数”一词,那么它可以编译正常,但为什么会这样,这是在我的代码中进行的正确更改吗?即,这是一个不会有任何影响的更改吗?对功能有影响吗?

unit AffineTransform;

interface

type
  { Rectangular area. }
  TCoordRect = object
  public
    Left, Top, Right, Bottom: Real;
    constructor CreatePos(ALeft, ATop, ARight, ABottom: Real);
    procedure   Include(AX, AY: Real);
  end;

implementation

constructor TCoordRect.CreatePos(ALeft, ATop, ARight, ABottom: Real);
begin
  Left := ALeft;
  Top := ATop;
  Right := ARight;
  Bottom := ABottom;
end;

procedure TCoordRect.Include(AX, AY: Real);
begin
  CreatePos(AX, AY, AX, AY)
end;

end.

最佳答案

对于这个传统的 Turbo Pascal 风格对象,关键字构造函数确实没有任何意义。尽管 object 构造函数确实有一些特殊处理,但这里绝对不需要这样做。这里无非是带有一些方法的记录

XE3 编译器已更改,因此它不再允许您在实例方法内调用 Self 上的构造函数。 classobject 都是如此。我没有看到任何有关为何进行此更改的文档。毫无疑问,随着时间的推移,它会渗出。

您的直接解决方案是将构造函数替换为过程。从长远来看,将其转换为记录而不是对象是有意义的。

<小时/>

我还建议您将该方法的名称更改为Initialize。一些库设计者似乎选择在其记录上使用 Create 和 Free 方法。这导致了大量的代码被编写成这样:

ctx := TRttiContext.Create;
try
  ....
finally
  ctx.Free;
end;

事实上,所有这些代码都是虚假的,可以简单地删除! TRttiContext 变量将自动初始化自身。

这种设计也设置了一个巨大的Heffalump Trap对于喜欢使用 FreeAndNil 的 Delphi 编码人员来说。将记录传递给 FreeAndNil 会导致一些有趣的烟花!

关于delphi - 为什么Delphi XE3给出 "E2382 Cannot call constructors using instance variables"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12953393/

相关文章:

java - 如何将数组传递给构造函数?

delphi - 异常事件后的 DBGrid 行为

javascript - 将对象的属性作为日期对象返回时出现问题

c++ - 默认情况下分离构造函数定义和声明

JavaScript 按特定常量值对多个属性上的对象数组进行排序

python - “int”对象不是可迭代的 GIS 脚本

c++ - 想通过使用带变量的构造函数来声明数组

c++ - 从 C++ DLL 调用过程有什么问题

delphi - 如何在delphi中使用fmx扩展

delphi - 如何检测字符串是否是Base64Encoded?