我正在使用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()都将导致访问冲突.为什么?
我的问题是,我是否可以在编程中使用指针.此外,是否有必要使用指向类的指针,因为类类型的变量已经保存了对象地址.
PMyClass(Item)
Run Code Online (Sandbox Code Playgroud)
这个演员是错的.因为Item是TMyClass不过PMyClass是^TMyClass.物品不能同时TMyClass和^TMyClass.
无效的强制转换是您遇到访问冲突的原因.
如果你确实想要获得一个值,^TMyClass那么你需要获取一个值的地址TMyClass.你的代码就是一个例子@Item.所以,Item是TMyClass的,因此@Item是^TMyClass.
有些情况^TMyClass可能有用,但在您提供的任何代码中都不会显示它们.例如,您可以使用类型变量^TMyClass来保存对类型变量的引用TMyClass.换句话说,指针有用的标准场景.
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |