![]() |
Eigene Operatoren definieren?
Hallo!
Erstmal vorweg: diese frage hat nichts mit einem Praktischen Problem zu tun, sondern vielmehr mit der frage: "geht das theoretisch und wenn ja, wie?". Ich habe mich gefragt, ob es möglich ist, sich eigene Operatoren zu definieren, also so etwas wie das "+"-Zeichen. Gruß Teekeks |
Re: Eigene Operatoren definieren?
Ja mit sogenannten Class Operatoren ( unter Win32 seit D10 paradoxerweise nicht für Klassen, sondern nur für Records verfügbar)
|
Re: Eigene Operatoren definieren?
Du kannst den vorhandenen Operatoren für deine eigenen Typen eine Bedeutung verleihen, aber neue Operatoren kannst du nicht einführen.
|
Re: Eigene Operatoren definieren?
Zitat:
|
Re: Eigene Operatoren definieren?
wenn du sowas meinst
Zitat:
in Delphi ... NEIN wenn du sowas vordefiniertes, wie das + für einen Record nutzen willst ![]() |
Re: Eigene Operatoren definieren?
Das Stichwort Class operator/Klassenoperator wurde dir ja schon genannt
|
Re: Eigene Operatoren definieren?
Indem du eine Art von Klassenmethode deklarierst, dies jedoch nicht mit class function oder class procedure, sondern mit class operator. Diese "Methode" muss einen speziellen Namen tragen, z.B. add.
@Markus #2: Warum ist das paradox? Das ist doch nur logisch, weil sich das ohne Garbage Collection einfach nicht regeln lässt. Edit: Okay, du hast Recht. :mrgreen: Daran habe ich gar nicht gedacht. |
Re: Eigene Operatoren definieren?
@Apollonius: Class Record Operator
|
Re: Eigene Operatoren definieren?
Class Operator für Klassen und Interfaces bekommt man auch hin ... man muß nur ein bissl Arbeit reinstecken :angel2:
|
Re: Eigene Operatoren definieren?
hmmm, geht das auch unter Lazarus?
|
Re: Eigene Operatoren definieren?
gute Frage ... FreePascal scheint es zu können ...
![]() |
Re: Eigene Operatoren definieren?
Zitat:
|
Re: Eigene Operatoren definieren?
TCustomVariantType ist aber nur 'ne Verwaltungsklasse für einen eigenen "Variant"-Typen
und Variants sind schon ganz schön große "Records". Aber man bekommt ein Objekt auch so mit Operatoren versehn, so daß es auch noch wie ein eigenständiges/normales Objekt reagieren kann. |
Re: Eigene Operatoren definieren?
Hmmm, ich hab jetzt das
Delphi-Quellcode:
Aber ich bekomme gesagt:
operator + (a,b:integer ):string;//da bleibt er stehen
implementation operator + (a,b:integer ):string; begin result:=inttostr(a+b); end; Zitat:
Gruß Teekeks [Edit] Das hier steht in der Graphmath.pp von lazarus:
Delphi-Quellcode:
Also scheint die Syntax korrekt zu sein... :gruebel:
Operator + (Addend1, Addend2 : TFloatPoint) : TFloatPoint;
implementation Operator + (Addend1, Addend2 : TFloatPoint) : TFloatPoint; begin // irgendwas end; |
Re: Eigene Operatoren definieren?
Delphi-Quellcode:
Das Ergebnis ist natürlich vom selben Typ
operator + (a,b:integer ) Result: Integer;
|
Re: Eigene Operatoren definieren?
Zitat:
|
Re: Eigene Operatoren definieren?
hast du dir mal den Link in #11 angesehn?
(vorallem die Antwort ... weil das war genau das gleiche Problem) [add] nee, ab D2006 (@sirius) |
Re: Eigene Operatoren definieren?
@himitsu: hab ich und geht nicht...
Und in der graphmath.pp steht auch folgendes:
Delphi-Quellcode:
Also sollte die Syntax korrekt sein. (die genannte Unit gehört zur LCL)
Operator + (Addend1 : TFloatPoint; Addend2 : Extended) : TFloatPoint;
implementation Operator + (Addend1 : TFloatPoint; Addend2 : Extended) : TFloatPoint; begin // irgentwas end; |
Re: Eigene Operatoren definieren?
probier einfach mal "add" statt "+"
|
Re: Eigene Operatoren definieren?
Hmmm, neee ich hab gerade den Fehler gefunden:
Es muss ein selbst-definierter Type sein! |
Re: Eigene Operatoren definieren?
Delphi-Quellcode:
TTest = record
private Data: Integer; public class operator Implicit(I: Integer): TTest; class operator Implicit(T: TTest): Integer; class operator Add(A, B: TTest): TTest; end; // ... class operator TTest.Add(A, B: TTest): TTest; begin result.Data := A.Data + B.Data; end; class operator TTest.Implicit(I: Integer): TTest; begin Result.Data := I; end; class operator TTest.Implicit(T: TTest): Integer; begin result := T.Data; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz