我可以使用类的指针吗?

3
我正在使用 Delphi XE3。在研究这篇帖子 Delphi - Maintaining Self References to an Object 之后,我明白了类类型的变量实际上是引用对象的指针。

因此,我编写了以下代码进行测试:
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;

在我的代码中,使用PMyClass(Item)似乎也可以获取对象地址,因为Integer(PMyClass(Item))与Integer(Item)相同。然而,使用指向对象的指针似乎无法调用任何方法,P.GetName()和P ^ .GetName()都会导致访问冲突。为什么?
我的问题是,我是否可以在编程中使用类的指针。同时,是否有必要使用类的指针,因为类类型的变量已经保存了对象地址。
2个回答

5
PMyClass(Item)

这个类型转换是错误的。因为ItemTMyClass,但PMyClass^TMyClass。Item不能既是TMyClass又是^TMyClass
无效的类型转换是你遇到访问冲突的原因。
如果您真的想获取一个值^TMyClass,那么您需要获取TMyClass值的地址。您代码中的示例为@Item。因此,ItemTMyClass,因此@Item^TMyClass
有些情况下,^TMyClass可能很有用,但在您提供的任何代码中都不明显。例如,您可以使用类型为^TMyClass的变量来保存类型为TMyClass的变量的引用。换句话说,指针有用的标准场景。

0

Item 已经是指向 TMyClass 实例的指针,您不需要引入过多的寻址级别。

NativeInt(Item) 可以给您地址的数字表示。要从 P 获取相同的表示,并进行适当的类型转换,您需要使用 P = @ItemNativeInt(P^)

我不知道指针在您的任务中如何有用.... 顺便问一下,您真正的问题是什么?


2
在64位平台上,指针可能无法适应32位整数,因此您应该使用 NativeInt 而不是 Integer,对吧? - Andreas Rejbrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接