Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Record als Eigenschaft von sich selber (https://www.delphipraxis.net/146408-record-als-eigenschaft-von-sich-selber.html)

MisterNiceGuy 19. Jan 2010 13:30


Record als Eigenschaft von sich selber
 
Schwer dieses Thema zu beschreiben, ich zeig mal an einem Beispiel was ich erreichen möchte:

Delphi-Quellcode:
type TAst = record
   UnterAst : TAst;
end;
Ich möchte also, dass mein Record sich selbst als Unterlement besitzt. Geht das irgendwie?

Reinhardtinho 19. Jan 2010 13:37

Re: Record als Eigenschaft von sich selber
 
Ich kenne es so, das man bei einem Record einen Zeiger auf den nächsten Record hat.

Delphi-Quellcode:
type
  PAst = ^TAst;
  TAst = record
    UnterAst : PAst;
  end;
end;

MisterNiceGuy 19. Jan 2010 13:44

Re: Record als Eigenschaft von sich selber
 
Danke das geht, dann wirds wohl ein Pointer... :)

uligerhardt 19. Jan 2010 13:56

Re: Record als Eigenschaft von sich selber
 
Zitat:

Zitat von MisterNiceGuy
Delphi-Quellcode:
type TAst = record
   UnterAst : TAst;
end;

Überleg dir mal, wie eine Variable von diesem Typ im Speicher ausschauen würde.
Vor allem, wenn UnterAst nicht das einzige Feld in TAst wäre.

s.h.a.r.k 19. Jan 2010 13:57

Re: Record als Eigenschaft von sich selber
 
Bei solchen Sachen würde ich dann auch eher zu Klassen tendieren, da diese da einfach mächtiger sind. Dort hast du auch einfach mehr Flexibilität.

himitsu 19. Jan 2010 14:08

Re: Record als Eigenschaft von sich selber
 
Grund: Der Record ist zu diesem Zeitpunkt (also innerhlab seiner eigenen Deklaration) noch nicht fertig.
Der Compiler weiß also noch nicht wie groß dieser mal wird
und kann demnach die Position des nächsten Feldes nicht berechnen.

Grund2: Dieses würde einen unendlichgroßen Record ergeben,
welches einfach nicht möglich ist.
> der Record wäre ja unendlich Mal in sich selber verschachtelt


Bei Objekten geht das, da dort zum Zeitpunkt der Kompilierung die Größe des Instanzzeigers ja schon feststeht.
Und da eine Klasse ein Zeiger ist, wird dieses auch nur einmal verschachtelt.

Medium 19. Jan 2010 15:07

Re: Record als Eigenschaft von sich selber
 
In Delphi muss bei solchen Strukturen in einer Klasse (wegen Grund 1) zudem eine Forward-Deklaration vorgenommen werden:
Delphi-Quellcode:
type
  TFoo = class;
  TFoo = class(TBar)
  private
    FSubFoo: TFoo;
  public
    // bla
  end;
Schaut erstmal nicht wirklich intuitiv aus, daher sei's gesagt.

himitsu 19. Jan 2010 15:16

Re: Record als Eigenschaft von sich selber
 
Zitat:

Zitat von Medium
Forward-Deklaration vorgenommen werden:

Die Forward-Deklaration ist hier nicht nötig, da der Typ schon bekannt ust und auch daß es sich um eine Klasse handelt.
(aber schaden tut's zumindestens nichts)

Das Problem liegt z.B. hier an der Tatsache, daß TFuu erst später deklariert wird und zu diesem Zeitpunkt also noch unbekannt ist.
Delphi-Quellcode:
type
  TFuu = class;
  TFoo = class(TBier)
    FSubFuu: TFuu;
  end;
  TFuu = class(TBar)
  end;

Medium 19. Jan 2010 15:33

Re: Record als Eigenschaft von sich selber
 
Wa echt? Hui, dann hab ich das wohl mit 2 Klassen die sich gegenseitig referenzieren verdurmschelt. Scusi :)

p80286 19. Jan 2010 16:16

Re: Record als Eigenschaft von sich selber
 
@MisterNiceGuy

Wozu soll das Gut sein?
irgendwie reicht meine Phantasie nicht dafür aus.

Gruß
K-H


Alle Zeitangaben in WEZ +2. Es ist jetzt 05:17 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf