Syntax A:
TYPE typname
' Typdeklarationen
DECLARE [STATIC] OPERATOR Operatorname ([Parameterliste]) [AS Datentyp]
END TYPE
Syntax B:
[STATIC] OPERATOR Typename.Operatorname ([Parameterliste]) [AS Datentyp]
Typ: Prozedur
Kategorie: Programmorganisation
OPERATOR deklariert oder definiert einen überladenen Operator. Der Befehl kann im Zusammenhang mit TYPE, CLASS und UNION eingesetzt werden.
- 'Typenname' gibt den Namen von TYPE, CLASS bzw. UNION an.
- 'Operatorname' ist eine Zuweisung, ein Iterator oder ein unärer oder binärer Operator.
Als 'Operatorname' sind folgede Operatoren erlaubt:
Zuweisung: | unärer Operator: | binärer Operator: | Iterator: |
|
Eine Überladung der unären Operatoren zur Pointer-Dereferenzierung * und der Pointer-Referenzierung -> arbeitet zur Zeit nicht korrekt.
Hinweis: LET verweist auf den Zuweisungsoperator wie in LET a=b (das Schlüsselwort LET wird im üblichen Gebrauch weggelassen)
Ein Beispiel zur Überladung von Iteratoren wird in diesem Tutorial behandelt.
Beschreibung:
Mit OPERATOR kann festgelegt werden, wie die oben genannten Operatoren arbeiten sollen, wenn mindestens eines der Argumente dem Datentyp des TYPE-, CLASS-, ENUM- oder UNION-Blocks entspricht.
Operatoren sind Funktionen. Der Operator '+' arbeitet wie FUNCTION plus( a AS datentyp, b AS datentyp ) AS datentyp. Operatoren können überladen werden, um verschiedene Datentypen als Parameter zu akzeptieren. Nur der CAST-Operator kann auch dazu überladen werden, um verschiedene Datentypen zurückzugeben.
Manche Operatoren werden innerhalb des Typs oder der Klasse deklariert, manche außerhalb. Dabei gilt:
- LET und andere Zuweisungen müssen innerhalb von TYPE oder CLASS (usw.) deklariert werden.
- NEW, DELETE und @ müssen ebenfalls innerhalb von TYPE oder CLASS definiert werden. Bei NEW und @ ist der Rückgabewert ein Pointer. DELETE besitzt keinen Rückgabewert.
- Unäre und binäre Operatoren (außer @) müssen außerhalb von TYPE oder CLASS deklariert werden. Ihr Rückgabewert wird explizit angegeben. Sie können jeden erlaubten Datentyp zurückgeben, außer -> (Zeiger auf Element-Zugriff), das den Datentyp von TYPE bzw. CLASS zurückgeben muss. Vergleichsoperatoren können nur dann sinnvoll eingesetzt werden, wenn der Rückgabewert als Zahl interpretiert werden kann. CAST darf nicht den Datentyp des TYPE bzw. CLASS zurückgeben.
Sämtliche Definitionen der Operatoren stehen außerhalb der TYPE- bzw. CLASS-Definition.
Beispiel:
TYPE Vector
AS SINGLE x, y
' gibt einen String zurück, der die Vektordaten enthält.
DECLARE OPERATOR CAST() AS STRING
End Type
' erlaubt die Addition zweier Vektoren
DECLARE OPERATOR + (v1 AS Vector, v2 AS Vector) AS Vector
OPERATOR Vector.CAST () AS STRING
RETURN "(" + STR(x) + ", " + STR(y) + ")"
END OPERATOR
OPERATOR + (v1 AS Vector, v2 AS Vector) AS Vector
RETURN TYPE<Vector>( v1.x + v2.x, v1.y + v2.y )
END OPERATOR
DIM a AS Vector = TYPE<Vector>( 1.2, 3.4 )
DIM b AS Vector = TYPE<Vector>( 8.9, 6.7 )
PRINT "a = "; a
PRINT "b = "; b
PRINT "a + b = "; a + b
Unterschiede zu QB: neu in FreeBASIC
Unterschiede zu früheren Versionen von FreeBASIC:
- OPERATOR existiert seit FreeBASIC 0.17
- Die Operatoren EXP, LOG, SIN, ASIN, COS, ACOS, TAN und ATN sind seit Version 0.22.0 überladbar
Siehe auch:
TYPE (UDT), UNION