Wskaźnik do klasy zdefiniowanej później

0

Szkolne pytanko:

type Pnode=^T_Node; // error

type
  T_Node = class
   ...
  Next: Pnode;
end;

Był jakiś trick, żeby to zgrabnie zdefiniować, ale zapomniałem....

1
type TNode = class;

type PNode = ^TNode;

type TNode = class /* ... */ end;
0

Nie działa (Delphi 10.2)

type T_Node=class;
error: type T_Node is not yet completely defined
2

Ach, mea culpa - tak powinno śmigać:

type
    PNode = ^TNode;
    TNode = class /* ... */ end;
3

ale wiesz, że wskaźnik na instancję klasy jest bez sensu bo zmienna przechowująca obiekt klasy sama w sobie jest wskaxniekiem

0
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.

1

@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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1