有时当我编写一个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.
答案 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;
因此,以下原因之一就在眼前: