Wskaźnik do klasy zdefiniowanej później

Wskaźnik do klasy zdefiniowanej później
CB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0

Szkolne pytanko:

Kopiuj
type Pnode=^T_Node; // error

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

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

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1
Kopiuj
type TNode = class;

type PNode = ^TNode;

type TNode = class /* ... */ end;
CB
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 13
0

Nie działa (Delphi 10.2)

Kopiuj
type T_Node=class;
Kopiuj
error: type T_Node is not yet completely defined
Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
2

Ach, mea culpa - tak powinno śmigać:

Kopiuj
type
    PNode = ^TNode;
    TNode = class /* ... */ end;
abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
3

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

  • Rejestracja: dni
  • Ostatnio: dni
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.

flowCRANE
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Tuchów
  • Postów: 12269
1

@coder-bis: takie coś robi się w przypadku struktur:

Kopiuj
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):
Kopiuj
type T_Node=class;

nazywa się forwardowaniem i pozwala na wzajemne wykorzystanie wielu klas:

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.