我正在使用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()都将导致访问冲突。为什么?
我的问题是,在编程中是否可以使用指向类的指针。另外,由于类类型的变量已经保存了对象地址,因此是否有必要使用指向类的指针。
答案 0 :(得分:5)
PMyClass(Item)
此演员选错了。因为Item
是TMyClass
,但是PMyClass
是^TMyClass
。项目不能同时为TMyClass
和^TMyClass
。
无效的类型转换是您遇到访问冲突的原因。
如果您确实确实想要获取一个^TMyClass
的值,那么您将需要获取一个TMyClass
值的地址。您的代码中的一个示例为@Item
。因此,Item
是TMyClass
,因此@Item
是^TMyClass
。
在某些情况下,^TMyClass
可能有用,但是在您提供的任何代码中它们都不明显。例如,您可以使用类型^TMyClass
的变量来保存对类型TMyClass
的引用。换句话说,是指针有用的标准方案。
答案 1 :(得分:0)
Item
已经是TMyClass
实例的指针,您不需要引入过多的地址。
NativeInt(Item)
为您提供地址的数字表示形式。要通过正确的类型转换从P
获得相同的表示,您需要使用P = @Item
和NativeInt(P^)
我看不到指针可能对您的任务有用。...顺便说一句,您真正的问题是什么?