Я новичок во FreePascal, но не новичок в Delphi.
В процессе изучения документации "Free Pascal Reference guide" наткнулся на пример кода, который показался мне странным (CHAPTER 5. OBJECTS - Class or static methods, стр. 79 PDF-документа):
- Код: Выделить всё
{$APPTYPE CONSOLE}
{$IFDEF FPC}{$MODE DELPHI}{$H+}{$ENDIF}
type
TTest = object
const
Epsylon = 100;
var
f: integer;
class var cv1, cv2: integer;
procedure myproc;
class procedure testproc;
class procedure testproc2; static;
procedure testproc3; static;
end;
procedure TTest.myproc;
begin
cv1 := 0;
f := 1;
end;
class procedure TTest.Testproc;
begin
cv1 := 1;
// f:=1;
end;
class procedure TTest.Testproc2;
begin
cv1 := 2;
// f:=1;
end;
procedure TTest.Testproc3;
begin
cv1 := 3;
// f:=1;
end;
var
P: procedure;
begin
P := @TTest.Myproc;
P := @TTest.Testproc;
P := @TTest.Testproc2;
P := @TTest.Testproc3;
end.
Программа действительно компилируется. Но, по-моему, не должна работать правильно.
Больше всего меня смущает строчка: "P := @TTest.Myproc;" - ведь на момент данного присваивания объект типа TTest ещё не создан, так что если мы выполним после данной строчки что-то типа "P();", то непонятно, с какими данными будет работать вызванная функция "myproc" - ведь переменная "f" не размещена в памяти?
И второй момент: непонятно, почему переменная "P" объявлена как "procedure", а не "procedure of object"? Насколько я помню, в Delphi (а программа написана с {$MODE DELPHI}) для доступа к методам объекта, даже если они статические, всё равно эта переменная должна быть "procedure of object".
И ещё один вопрос: я попытался скомпилировать данную программу (закомментировав строчку "P := @TTest.Myproc;") в режиме {$MODE objfpc}, но мне не удалось, как бы я ни объявлял переменную "P" ("procedure;" или "procedure of object;"), также я пытался ставить и убирать знак "@" в выражении "P := @TTest.Testproc;" - в любом случае компилятор выдаёт мне сообщение об ошибке несоответствия типов в данной строке. Как в данном режиме сделать правильно присвоение переменной процедурного типа?