Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Referenz - TYPE (Forward Referencing)

Referenz-Navigation

 

Syntax A: TYPE ForwardName AS TypeName
Syntax B: TYPE AS TypeName ForwardName
Typ: Anweisung
Kategorie: Klassen

In manchen Situationen ist es notwendig, einen BefehlsreferenzeintragPointer auf ein UDT zu legen, der erst später im Programm definiert wird. Um dies zu ermöglichen, kann ein Forward-Type erstellt werden.

Beispiel:

TYPE FwdUDT2 AS UDT2

TYPE UDT1
  a AS INTEGER
  b AS FwdUDT2 PTR
END TYPE

TYPE UDT2
  c AS INTEGER
  d AS INTEGER
END TYPE

Wer stattdessen den folgenden Code versucht, erhält die Fehlermeldung "Typ nicht definiert":

' Fehlerhafte Einbindung eines noch nicht existenten UDTs
TYPE UDT1
  a AS INTEGER
  b AS UDT2 PTR
END TYPE

TYPE UDT2
  c AS INTEGER
  d AS INTEGER
END TYPE

Beim Forward Referencing ist darauf zu achten, dass nur UDTs zur Deklaration verwendet werden können, die vollständig sind. Ein UDT ist dann vollständig, wenn die Größe aller Elemente im UDT bekannt sind. Anders gesagt muss vom gesamten UDT die Größe in Byte bekannt sein. Folgender Code wird den Compilerfehler 'Incomplete type' ergeben:

' Fehlerhafte Einbindung eines unvollständigen UDTs
Type einTyp As forwardTyp

Dim As einTyp beispiel

Type forwardTyp
  dummy As Integer
End Type

Um das Problem zu lösen, muss, bevor eine Instanz des UDTs erstellt wird, die Größe bekannt sein. Für das kleine Beispiel würde es folgendermaßen aussehen:

Type einTyp As forwardTyp

Type forwardTyp
  dummy As Integer
End Type

Dim As einTyp beispiel

Benötigt man die Instanz aber aus irgendwelchen Gründen vor dem Forward-Type, kann das durch einen Pointer gelöst werden. Die Größe eines Pointers ist immer bekannt, folglich auch kein Problem:

Type einTyp As forwardTyp

Dim As einTyp Ptr beispiel

Type forwardTyp
  dummy As Integer
End Type

Beispiel einer Fenster-Klasse mit Button:

Type tempButton As button           ' Forward-Type für 'button'

Type fenster                        ' Fenster-Klasse
  beendenknopf As tempButton Ptr    ' Beenden-Button der noch unbekannten Klasse
  x As Integer
  y As Integer
End Type

Type button                         ' Button-Klasse
  parent As fenster Ptr             ' Eltern-Type der Button-Klasse
  x As Integer
  y As Integer
End Type

' Objekte erstellen
Dim As fenster Ptr meinProgramm

meinProgramm = New fenster
meinProgramm->beendenknopf = New button

' Daten zuweisen
meinProgramm->x = 500
meinProgramm->y = 200

meinProgramm->beendenknopf->parent = meinProgramm
meinProgramm->beendenknopf->x = 150
meinProgramm->beendenknopf->y = 25

' Fenster erstellen
ScreenRes meinProgramm->x, meinProgramm->y
Line (0, 0)-(meinProgramm->beendenknopf->x, meinProgramm->beendenknopf->y), 15, BF
Draw String (5, 5), meinProgramm & " = " & meinProgramm->beendenknopf->parent, 0

' Objekte zerstören
Delete meinProgramm->beendenknopf
Delete meinProgramm

Sleep

Unterschiede zu QB: neu in FreeBASIC

Siehe auch:
BefehlsreferenzeintragTYPE (UDT), BefehlsreferenzeintragTYPE (Funktion), BefehlsreferenzeintragDatentypen und Deklarationen, BefehlsreferenzeintragObjektorientierung


Zusätzliche Informationen und Funktionen
  • Der Referenzeintrag wurde am 30.07.2007 von Redakteurnemored angelegt.
  • Die aktuellste Version wurde am 23.11.2013 von RedakteurMOD gespeichert.
  Versionen Versionen