我需要在这个实例中获取指向我的类实例的指针.我不能直接使用"Self",我需要商店指针以备将来使用.我尝试了下一个代码:
type
TTest = class(TObject)
public
class function getClassPointer: Pointer;
function getSelfPointer: Pointer;
end;
class function TTest.getClassPointer: Pointer;
begin
Result := Pointer(Self);
end;
function TTest.getSelfPointer: Pointer;
begin
Result := Pointer(Self);
end;
Run Code Online (Sandbox Code Playgroud)
结果都错了 - 这段代码:
test := TTest.Create;
Writeln('Actual object address: ', IntToHex(Integer(@test), 8));
Writeln('Class "Self" value: ', IntToHex(Integer(test.getClassPointer()), 8));
Writeln('Object "Self" value: ', IntToHex(Integer(test.getSelfPointer()), 8));
Run Code Online (Sandbox Code Playgroud)
收益:
Actual object address: 00416E6C
Class "Self" value: 0040E55C
Object "Self" value: 01EE0D10
Run Code Online (Sandbox Code Playgroud)
请帮助我理解,这个"自我"的价值是什么?"Self"是指向此类实例的指针吗?如何将此指针用于此对象之外的未来使用?如何从这个值获得正确的指针?
我正在使用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', …Run Code Online (Sandbox Code Playgroud)