我可以使用指向类的指针吗?

时间:2018-11-23 07:23:47

标签: delphi pascal

我正在使用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 个答案:

答案 0 :(得分:5)

PMyClass(Item)

此演员选错了。因为ItemTMyClass,但是PMyClass^TMyClass。项目不能同时为TMyClass^TMyClass

无效的类型转换是您遇到访问冲突的原因。

如果您确实确实想要获取一个^TMyClass的值,那么您将需要获取一个TMyClass值的地址。您的代码中的一个示例为@Item。因此,ItemTMyClass,因此@Item^TMyClass

在某些情况下,^TMyClass可能有用,但是在您提供的任何代码中它们都不明显。例如,您可以使用类型^TMyClass的变量来保存对类型TMyClass的引用。换句话说,是指针有用的标准方案。

答案 1 :(得分:0)

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

NativeInt(Item)为您提供地址的数字表示形式。要通过正确的类型转换从P获得相同的表示,您需要使用P = @ItemNativeInt(P^)

我看不到指针可能对您的任务有用。...顺便说一句,您真正的问题是什么?