TYPE (Forward Referencing)

FreeBASIC-Referenz » Alphabetische Befehlsreferenz » T » TYPE (Forward Referencing)

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)