Delphi属性stackoverflow错误

道兹维

我的财产类别:

unit SubImage;

interface

type
TSubImage = class
private
  { private declarations }
  function getHeight: Integer;
  function getWidth: Integer;
  procedure setHeight(const Value: Integer);
  procedure setWidth(const Value: Integer);
protected
  { protected declarations }
public
  { public declarations }
  property width : Integer read getWidth write setWidth;
  property height : Integer read getHeight write setHeight;
published
  { published declarations }
end;
implementation

{ TSubImage }

function TSubImage.getHeight: Integer;
begin
  Result:= height;
end;

function TSubImage.getWidth: Integer;
begin
  Result:= width;
end;

procedure TSubImage.setHeight(const Value: Integer);
begin
  height:= Value;
end;

procedure TSubImage.setWidth(const Value: Integer);
begin
  width:= Value;
end;

end.

任务:

objSubImg.width:= imgOverview.width;
objSubImg.height:= imgOverview.heigh

有趣的错误:

stackoverflow at xxxxxx

我正在学习Delphi中的属性。我创建了一个类,但它给出了一个错误。我不明白,我的错误在哪里?

我也不明白为什么我们使用属性而不是setter / getter方法。无论如何有人可以帮助我,我该如何解决此代码?

我无法设置属性值。

戴维·赫弗南

这是一个非终止的递归。吸气剂看起来像这样:

function TSubImage.getHeight: Integer;
begin
  Result := height;
end;

但是height是财产。因此,编译器将其重写为:

function TSubImage.getHeight: Integer;
begin
  Result := getHeight;
end;

这是一个非终止的递归。因此,堆栈溢出。

您需要声明字段来存储值:

type
  TSubImage = class
  private
    FHeight: Integer;
    FWidth: Integer;
    function getHeight: Integer;
    function getWidth: Integer;
    procedure setHeight(const Value: Integer);
    procedure setWidth(const Value: Integer);
  public
    property width: Integer read getWidth write setWidth;
    property height: Integer read getHeight write setHeight;
  end;

然后获取并设置值:

function TSubImage.getHeight: Integer;
begin
  Result:= FHeight;
end;

procedure TSubImage.setHeight(const Value: Integer);
begin
  FHeight:= Value;
end;

同样对于其他财产。

在这个简单的示例中,您不需要使用getter和setter函数。您可以这样声明属性:

property width: Integer read FWidth write FWidth;
property height: Integer read FHeight write FHeight;

但是我想您知道这一点,并且正在探索getter / setter函数的工作方式。

至于为什么我们使用属性而不是getter和setter函数,这归结为代码的清晰性和可读性。您可以用getter和setter函数替换属性。毕竟,这就是编译器要做的全部工作。但是写起来通常更清晰:

h := obj.Height;
obj.Height := h*2;

h := obj.GetHeight;
obj.SetHeight(h*2);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Delphi:类属性的错误2008年不兼容的类型

来自分类Dev

JsonObject构建Stackoverflow错误

来自分类Dev

Delphi中的静态属性

来自分类Dev

为什么stackoverflow错误混乱?

来自分类Dev

类的StackOverFlow错误

来自分类Dev

QuickSort算法的StackOverFlow错误

来自分类Dev

大数组的快速排序stackoverflow错误

来自分类Dev

2 EditText + 2 TextWatcher-stackoverflow错误

来自分类Dev

为什么会出现Stackoverflow错误?

来自分类Dev

代码行上的StackOverFlow错误

来自分类Dev

Spring Security StackOverflow错误

来自分类Dev

stackoverflow错误递归平方根

来自分类Dev

使用Firebase时出现Flutter Stackoverflow错误

来自分类Dev

AutoMapper Stackoverflow错误以启动API

来自分类Dev

如何解决Stackoverflow错误?

来自分类Dev

Java Swing和Socket Messenger StackOverflow错误

来自分类Dev

Android addView StackOverFlow错误

来自分类Dev

GSON.fromJson stackoverflow错误

来自分类Dev

StackOverflow递归错误

来自分类Dev

迷宫生成stackoverflow错误

来自分类Dev

TEdit属性变量delphi

来自分类Dev

Gradle:Stackoverflow错误

来自分类Dev

GSON stackoverflow错误

来自分类Dev

Grails forward()导致StackOverflow错误

来自分类Dev

Gson StackOverflow错误Android

来自分类Dev

回文StackOverflow错误

来自分类Dev

Scala代码中的Stackoverflow错误

来自分类Dev

Spark RandomForest 训练 StackOverflow 错误

来自分类Dev

迷宫求解程序的 StackOverflow 错误