Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [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!

Tutorial

Überladen von Prozeduren und Operatoren (Overload)

von RedakteurMODSeite 5 von 9

Bei den BefehlsreferenzeintragOperatoren gibt es Unterschiede, wie, oder treffender WO sie überladen werden können. Hierbei unterscheidet man globale Operatoren und Memberoperatoren.
Memberoperatoren müssen immer innerhalb des BefehlsreferenzeintragTypes stehen. Dazu gehören:

Um diese Operatoren mit dem eigenen BefehlsreferenzeintragUDT verwenden zu können, müssen diese immer explizit deklariert und angegeben werden.

Dagegen die globalen Operatoren, die immer außerhalb des BefehlsreferenzeintragUDTs stehen müssen:
(Operatoren mit einem Operand):

(Operatoren mit zwei Operanden):

Globale Operatoren unterscheiden sich nochmals in ihrer Anzahl an Operanden. Während die einen nur einen Operand haben, der immer nach dem Operator steht (z.B.: Not 5, @myVar), haben die anderen zwei Operanden, bei denen einer vor und einer hinter dem Operator steht (z.B.: 5 + 9, myVar >= 7).
Es ist nicht immer nötig, einen globalen Operator zu überladen. Durch geschickte Überladung von BefehlsreferenzeintragCast und BefehlsreferenzeintragLet bleibt es einem oft erspart. Ob das so ist, sollte natürlich getestet werden.

In unserem Beispiel gibt es keinen überladenen globalen Operator, da soweit alle funktioniert haben, der Vollständigkeit halber hier aber noch ein Beispiel, wie das aussehen kann:

Operator + (lhs As eigentlich_ein_string, rhs As eigentlich_ein_string) As eigentlich_ein_string
    Return Val(lhs.daten) + Val(rhs.daten)
End Operator

Die Variablennamen 'lhs' (Left-Hand Side) und 'rhs' (Right-Hand Side) stehen dabei für den Operand vor ('lhs') und hinter ('rhs') des Operators. Sie sind aber keine Pflichtnamen, sorgen aber für einfacheres Verständnis und Vereinheitlichung des Codes.
Soll ein globaler Operator mit anderen Datentypen als dem eigenen BefehlsreferenzeintragType kombiniert werden, muss er für jede mögliche Konstellation überladen werden.

Hinweis:
Momentan können nicht alle Operatoren überladen werden. So gibt der Versuch einer Überladung von '->' oder '*' (Pointer) einen Compilerfehler aus, mit dem Hinweis 'TODO', wenn sie innerhalb des BefehlsreferenzeintragType deklariert werden. Global lassen sie sich zwar überladen, es dürfen dann aber keine Pointer auf den Typen übergeben werden, was nicht zielführend ist.
Auch der '@'-Operator verhält sich atypisch, da er immer innerhalb des BefehlsreferenzeintragUDTs deklariert werden muss.
Die Operatoren New[] und Delete[] sollten BefehlsreferenzeintragStatic sein.
Die Operatoren Exp, Log, Sin, ASin, Cos, ACos, Tan und Atn sind erst ab Version 0.22.0 SVN überladbar.
Das Überladen von '[]' ist erst seit Version 0.91.0 möglich.

 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  6  7  8  9  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 03.06.2010 von RedakteurMOD angelegt.
  • Die aktuellste Version wurde am 23.11.2013 von RedakteurMOD gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen