1

有时当我写一个类然后测试它时,我在底部的图片中得到错误,当我尝试调试它时,编辑器显示我要访问的属性是“不可访问的值”(在构造函数令人惊讶地工作)。

上次我遇到这个问题时,我只是通过将代码复制到一个新单元并删除旧单元来解决它,所以我认为它与预编译的 .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.

错误

4

1 回答 1

3

首先,关于为什么Inc不起作用,来自例程的帮助Inc

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

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


其次,关于您为什么会遇到访问冲突;一个 AV,尤其是当读取地址接近零时,您很可能正在访问未分配的对象变量,这也会导致Inaccessible value调试器提示。

此测试代码有效:

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;

因此,出现以下原因之一:

  • 你还没有创建你正在处理的对象,
  • 您尚未创建要传递的对象。
于 2013-05-19T23:19:00.237 回答