无法访问的字段错误

时间:2013-05-19 21:51:50

标签: delphi delphi-7

有时当我编写一个Class然后测试它时,我会在底部的图片中看到错误,当我尝试调试它时,编辑器会告诉我,我想要访问的属性是“不可访问的值”(初始化)他们在构造函数中工作得令人惊讶。)

上次我遇到这个问题时,我只是通过将代码复制到一个新单元并删除旧单元来修复它,所以我认为它与预编译的.dcu文件有关。但不幸的是,这个棘手的解决方案不适用于这个类,我做错了什么,或者这是由于Delphi 7过时(我在Win8上工作)引起的?

unit UVector;

interface

uses

    SysUtils, Types;

type

    Vector2f = class

        private

           x : extended;
           y : extended;

        public

            function getX() : extended;
            function getY() : extended;
            constructor create(x,y : extended);
            procedure add(v : Vector2f);


        end;


implementation

constructor Vector2f.create(x,y : extended); // works!
begin
    self.x := x;
    self.y := y;
end;

procedure Vector2f.add(v : Vector2f);
begin
    //inc(x, v.getX());     // compiler error : left side cannot be assigned to
    //inc(y, v.gety());     // compiler error : left side cannot be assigned to
    self.x := self.x + v.getX(); //inaccessible value (at runtime) for x and getX()
    self.y := self.y + v.getY(); //inaccessible value (at runtime) for y and getY()
end;

function Vector2f.getX() : extended;
begin
    result := x;
end;

function Vector2f.getY() : extended;
begin
    result := y;
end;


end.

error

1 个答案:

答案 0 :(得分:3)

首先,关于“Inc无效的原因,来自help on the Inc routine

  

将序数值增加1或N. ... X是序数类型的变量(包括Int64)......

Extended不是序数值类型,而是实数值类型。


其次,关于您获取访问权限的原因; AV,特别是当读取地址接近零时,很可能您正在访问未分配的对象变量,这也会导致 Inaccessible值调试器提示。

此测试代码有效:

procedure TForm1.Button1Click(Sender: TObject);
var
  V1: Vector2f;
  V2: Vector2f;
begin
  V1 := Vector2f.create(123.45, 234.56);
  V2 := Vector2f.create(123.45, 234.56);
  try
    V1.add(V2);
    Caption := FloatToStr(V1.getX);  // Outputs 246.9
  finally
    V2.Free;
    V1.Free;
  end;
end;

因此,以下原因之一就在眼前:

  • 您尚未创建所使用的对象,
  • 您尚未创建要传递的对象。