Pfeil

FreeBASIC-Referenz » Operatoren in FreeBASIC » Pfeil

Syntax: UDT_Pointer->Feldname
Typ: Operator
Kategorie: Operatoren

Der Pfeil-Operator greift auf ein Element eines Feldes zu, zu dem ein Pointer angegeben wurde.
Der Operator kann mithilfe von OPERATOR überladen werden.

Der Pointer auf das gewünschte Element kann auch mithilfe von OFFSETOF berechnet und anschließend dereferenziert werden. Aufgrund der Pointerarithmetik ist es dabei jedoch notwendig, auf die richtigen Typen zu casten, was diese Methode sehr umständlich macht. Im folgenden Beispiel wird sie zur Demonstration aufgeführt.

Beispiel:

TYPE rect
  x AS SHORT
  y AS INTEGER
END TYPE

DIM r  AS rect
DIM rp AS rect PTR = @r

rp->x = 4
rp->y = 2

' Direkter Zugriff ohne Pointer
PRINT "x = " & r.x   & ", y = " & r.y
' Zugriff über den Pfeil-Operator
PRINT "x = " & rp->x & ", y = " & rp->y
' Pointer-Zugriff über OFFSETOF
PRINT "x = " & *Cast(Short   Ptr, (Cast(UInteger, rp) + OFFSETOF(rect, x))) & _
    ", y = " & *Cast(Integer Ptr, (Cast(UInteger, rp) + OFFSETOF(rect, y)))
SLEEP

Wie man sieht, wird tatsächlich die Variable 'r' durch Zugriffe über diesen Operator verändert.

Beispiel zur Operator-Überladung:

Type T Extends Object
    Public:
    Declare Function memberFunction() As Integer
End Type
Function T.memberFunction() As Integer
    Return 15 'irgendeine beispielhafte Rückgabelogik
End Function

Type D
    As T Ptr m_ptr
End Type
Operator -> (ByRef d_ As D) ByRef As T
    Return *d_.m_ptr
End Operator

Dim As D d_
Print d_->memberFunction()
Sleep

In dem Beispiel wird der Pfeil für die Klasse D so überladen, dass als Rückgabe der innere T Ptr dereferenziert wird. Dabei ist die BYREF Rückgabe entscheidend.
Somit kann direkt auf memberFunction von m_ptr zugegriffen werden.


Unterschiede zu QB: neu in FreeBASIC

Unterschiede zu früheren Versionen von FreeBASIC:

Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb steht dieser Operator nicht zur Verfügung.

Siehe auch:
TYPE (UDT), TYPE (Funktion), WITH, OFFSETOF, . (Feldzugriff), @ (Adresse von), * (Wert von)