我可以将指针用于类吗?

ala*_*ncc 3 delphi pascal

我正在使用Delphi XE3.在研究了Delphi之后 - 维护对象的自引用之后,我理解类类型的变量实际上是引用对象的指针.

因此,我编写以下代码来测试它,如下所示:

TMyClass = class
public
  constructor Create(Name: string);
  destructor Destroy;

  function GetName: string;

private
  FName: string;
end;

PMyClass = ^TMyClass;

constructor TMyClass.Create(Name: string);
begin
  FName := Name;
end;

destructor TMyClass.Destroy;
begin

end;

function TMyClass.GetName: string;
begin
  Result := FName;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Item: TMyClass;
  P: PMyClass;
begin
  Item := TMyClass.Create('Jim');

  P := PMyClass(Item);

  OutputDebugString(PWideChar(Format('Address of object: %x; Address of variable Item: %x; Value of P: %x;',
                            [Integer(Item), Integer(@Item), Integer(P)])));

  OutputDebugString(PWideChar(Format('Name is %s', [Item.GetName()])));
  OutputDebugString(PWideChar(Format('Name is %s', [P.GetName()])));
end;
Run Code Online (Sandbox Code Playgroud)

在我的代码中,使用PMyClass(Item)似乎也得到了对象地址,因为Integer(PMyClass(Item))与Integer(Item)相同.但是,似乎使用指向对象的指针,我无法调用任何方法,P.GetName()和P ^ .GetName()都将导致访问冲突.为什么?

我的问题是,我是否可以在编程中使用指针.此外,是否有必要使用指向类的指针,因为类类型的变量已经保存了对象地址.

Dav*_*nan 5

PMyClass(Item)
Run Code Online (Sandbox Code Playgroud)

这个演员是错的.因为ItemTMyClass不过PMyClass^TMyClass.物品不能同时TMyClass^TMyClass.

无效的强制转换是您遇到访问冲突的原因.

如果你确实想要获得一个值,^TMyClass那么你需要获取一个值的地址TMyClass.你的代码就是一个例子@Item.所以,ItemTMyClass的,因此@Item^TMyClass.

有些情况^TMyClass可能有用,但在您提供的任何代码中都不会显示它们.例如,您可以使用类型变量^TMyClass来保存对类型变量的引用TMyClass.换句话说,指针有用的标准场景.