Как проверить, является ли переданный аргумент классом?
У меня есть функция (написано в Delphi 7, 32-разрядная версия):
Функция GetVMTAddr(var C): Integer; Начать Результат:= целое число (C); Пытаться PVmt(Результат)^.SelfPtr:= PVmt(C)^.SelfPtr; Кроме Результат:= 0; Конец; Конец;
Который возвращает адрес VMT (я думаю, что это VMT, я не уверен) и проверяет, является ли параметр объектом (try...except
, который является imho плохое решение).
У меня есть два вопроса:
1) Это действительно адрес VMT или я ошибаюсь?
2) Есть ли лучшее решение, чтобы проверить, что параметр является объектом?
1 ответ
Аргумент C
будет содержать адрес VMT, если вы передаете ему ссылку на класс (он же метакласс).
Условие, которое вы проверяете в функции, бесполезно. Он проверяет, доступна ли для записи определенная область памяти, и все. Если вы проверяли, является ли SelfPtr
поле было равно самому значению, тогда вы были бы ближе. Что-то вроде этого:
if PVmt(C).SelfPtr = C then
Result := C;
То, что вы спрашиваете, очень похоже на вопрос, заданный здесь несколько лет назад, когда кто-то хотел узнать, как определить тип переменной. Как я объяснил тогда, если вы дошли до того, что думаете, что вам нужно использовать этот код, у вас уже есть проблемы. Вернитесь назад и измените свой дизайн, чтобы вы могли знать, есть ли у вас ссылка на класс или ссылка на объект, вместо того, чтобы угадывать.
Если вам действительно нужно угадать, то вы можете попробовать использовать функции, предоставляемые JCL, IsClass
а также IsObject
, Они делают то же самое, догадываясь, что ваш код пытается использовать, но они делают это правильно.