【问题标题】:How to check if passed argument is class?如何检查传递的参数是否是类?
【发布时间】:2012-08-19 01:26:45
【问题描述】:

我有函数(用 Delphi 7 32 位编写):

函数 GetVMTAddr(var C): Integer;
开始
  结果:=整数(C);
  尝试
    PVmt(结果)^.SelfPtr := PVmt(C)^.SelfPtr;
  除了
    结果:= 0;
  结尾;
结束;

返回 VMT 地址(我认为它是 VMT,我不确定)并检查参数是否为对象(try...except,这是恕我直言的糟糕解决方案)。
我有两个问题:
1) 这真的是 VMT 地址还是我错了?
2)有没有更好的方法来检查参数是否是一个对象?

【问题讨论】:

  • This question 可能会有所帮助。
  • @Ken White:谢谢,我找到了这个问题,但还有第二个问题,我找不到答案。
  • “不要在家尝试这个”类别中的有趣问题。

标签: delphi class vmt


【解决方案1】:

如果您传递给它的是类引用(也称为元类),参数 C 将保存一个 VMT 地址。

你在函数中检查的条件是没有用的。它检查某个内存区域是否可写,仅此而已。如果您检查 SelfPtr 字段是否等于值本身,那么您会更接近。像这样的:

if PVmt(C).SelfPtr = C then
  Result := C;

您问的问题与几年前在这里提出的问题非常相似,有人想知道how to detect the type of a variable。正如我当时解释的那样,如果您认为您需要使用此代码,那么您已经遇到了麻烦。返回并更改您的设计,以便您可以知道您是否有类引用或对象引用,而不必猜测。

如果你真的要猜,那么你可以尝试使用JCL提供的函数IsClassIsObject。他们会做与您的代码尝试使用相同的猜测,但他们做对了。

【讨论】:

  • +many 表示“如果您认为需要使用此代码,那么您已经遇到麻烦了”
  • ...它还在猜测。 ;-)
猜你喜欢
  • 2022-01-04
  • 1970-01-01
  • 2018-03-13
  • 2014-07-09
  • 1970-01-01
  • 2012-05-28
  • 2015-04-06
  • 2016-05-07
  • 2013-03-22
相关资源
最近更新 更多