拉撒路(免费帕斯卡)。看似不必要的编译器警告

时间:2013-03-16 07:22:25

标签: freepascal lazarus

我是Free Pascal和Lazarus的新手。我正在测试新的“高级记录”功能,并获得看似不必要的编译器警告。

代码非常简单,只是一个记录,只有一个方法来初始化数据字段。类似的东西:

{$mode delphi}

type TTest =
  record
    a,b: double;
    procedure Init(x,y: double);
  end

procedure TTest.Init(x,y: double);
begin
  test.a := x;
  test.b := y;
end;


var t: TTest;
begin
  t.Init(0.1,0.2);

显示的最后一行“t.Init()”始终生成编译器警告“变量”t“似乎未初始化”。

好的,它只是警告,显然我可以忍受它,但我只是想确保它不是由于我的一些潜在的误解。


编辑以添加新信息。

重新方法verus构造函数点。 再看看这个,我很高兴FPC不允许构造函数用于记录。 Delphi有构造函数,但没有析构函数,据我所知,构造函数(对于记录)完全没有做任何方法无法做到的事情。我是一个极简主义者,所以对我而言,没有必要使用额外的语法,除了一些现有的语法之外什么也没做。

特别是对于像这样的简单记录,声明它的行为( var t:TTest )会完成此记录所需的所有“构造”。其他任何东西(比如我的Init)只是设置值,它无论如何都没有构建任何东西。因此,只要我看到构造函数不是答案,编译器只需要删除警告。

研究这个问题我遇到过另一种经常使用的技术,即所谓的“工厂功能”。也就是说,记录的功能 ,例如:

function InitTTest(x,y: double): TTest;
begin
  Result.a := x;
  Result.b := y;
end;

这项技术确实有效,并消除了警告信息。我不喜欢这种方法,但我不会使用它。高级记录没有继承和类的其他功能,封装就是他们为他们所做的一切。所以我真的不喜欢在这样的记录之外制作一个“工厂功能”。

请注意以上只是“noob”的意见,经过一些研究来回答我自己的问题。所以如果我对上述任何事情都错了,我很乐意纠正。 :)

1 个答案:

答案 0 :(得分:3)

是的,这就是构造函数的用途,下面用FPC trunk 编译并且不会产生警告:

{$mode delphi}

type TTest =
  record
    a,b: double;
    constructor Init(x,y: double);
  end;

constructor TTest.Init(x,y: double);
begin
  a := x;
  b := y;
end;


var t: TTest;
begin
  t.Init(0.1,0.2);
end.