Szkolne pytanko:
type Pnode=^T_Node; // error
type
T_Node = class
...
Next: Pnode;
end;
Był jakiś trick, żeby to zgrabnie zdefiniować, ale zapomniałem....
Szkolne pytanko:
type Pnode=^T_Node; // error
type
T_Node = class
...
Next: Pnode;
end;
Był jakiś trick, żeby to zgrabnie zdefiniować, ale zapomniałem....
type TNode = class;
type PNode = ^TNode;
type TNode = class /* ... */ end;
Nie działa (Delphi 10.2)
type T_Node=class;
error: type T_Node is not yet completely defined
Ach, mea culpa - tak powinno śmigać:
type
PNode = ^TNode;
TNode = class /* ... */ end;
ale wiesz, że wskaźnik na instancję klasy jest bez sensu bo zmienna przechowująca obiekt klasy sama w sobie jest wskaxniekiem
abrakadaber napisał(a):
ale wiesz, że wskaźnik na instancję klasy jest bez sensu bo zmienna przechowująca obiekt klasy sama w sobie jest wskaxniekiem
No faktycznie. To problem rozwiązany.
@coder-bis: takie coś robi się w przypadku struktur:
type
PNode = ^TNode;
TNode = record
// fields
end;
W przypadku klas nie ma to większego sensu, co wyjaśnił poprzednik.
Nie napisałeś o jaki dialekt i kompilator chodzi. Mogę się mylić, ale z tego co pamiętam, pod Delphi7 wymagane było umieszczenie obu deklaracji typów (wskaźnika i struktury) w jednej sekcji type
, a rozdzielenie ich na dwie sekcje powodowało błąd kompilacji. Podobnie w przypadku forwardowania klas (o tym niżej). W razie gdybym jednak źle pamiętał – zignorujcie ten paragraf.
Natomiast poniższa konstrukcja:
coder-bis napisał(a):
type T_Node=class;
nazywa się forwardowaniem i pozwala na wzajemne wykorzystanie wielu klas:
type
TFoo = class;
type
TBar = class
private
FFoo: TFoo;
// ..
end;
type
TFoo = class
private
FBar: TBar;
// ..
end;
Więcej na ten temat znajdziesz w dokumentacji: Forward Declarations and Mutually Dependent Classes. Forwardowanie nie dotyczy wyłącznie klas – możliwe jest też wczesne deklarowanie np. funkcji. O tym z kolei więcej tutaj: Forward and Interface Declarations.