Syntax A: TYPE ForwardName AS TypeName
Syntax B: TYPE AS TypeName ForwardName
Typ: Anweisung
Kategorie: Speicherverwaltung/Programmorganisation
In manchen Situationen ist es notwendig, einen Pointer auf einen Typ zu legen, der erst später im Programm definiert wird. Um dies zu ermöglichen, kann ein Forward-Typ 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 diesen Code versucht, erhält die Fehlermeldung "Typ nicht definiert":
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 Types zur Deklaration verwendet werden können, die vollständig sind. Ein Type ist dann vollständig, wenn die Größe aller Elemente im Type bekannt sind. Anders gesagt muss die Größe in Byte des gesamten Types bekannt sein. Folgender Code wird den Compilerfehler 'Incomplete type' ergeben:
Type einTyp As forwardTyp
Dim As einTyp beispiel
Type forwardTyp
dummy As Integer
End Type
Um das Problem zu lösen muss nun, bevor eine Instanz des Typs 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-Typ, 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 QuickBASIC:
- neu in FreeBASIC
Unterschiede zu früheren Versionen von FreeBASIC:
- bis einschließlich Version 0.21.1 enthält 'Syntax B' einen Fehler, der zu Problemen führen kann
Siehe auch:
TYPE (UDT), TYPE (Funktion)