![]() |
Operatoren überschreiben
Hallo,
das klingt etwas absurd und ich benötige es auch nicht, aber mich interessiert, ob man in Delphi Operatoren überschreiben kann. Dass ich z.B. sage, das "+" soll andere Operationen ausführen, als es normalerweise der Fall ist. Geht das mit Delphi? |
Re: Operatoren überschreiben
In Delphi 2006 - Ja. Siehe
![]() |
Re: Operatoren überschreiben
Hallo, stimmt, da geht das, das habe ich gesehen. Also unter Delphi-Versionen kleiner 2006 ist dies gar nicht möglich?
|
Re: Operatoren überschreiben
Zitat:
|
Re: Operatoren überschreiben
Zitat:
Ada, das ja auch auf Pascal basiert, kann das seit 1995, darum habe ich gefragt. ;)
Code:
[b][color=Navy]with[/color][/b] Ada.Integer_Text_IO;
[b][color=green]------------------------------------------------------------------------------ -- PROCEDURE: MultiRationalNumber -- DESCRIPTION: -- Main function to add 2 rational numbers ------------------------------------------------------------------------------[/color][/b] [b][color=Navy]procedure[/color][/b] MultiRationalNumber [b][color=Navy]is[/color][/b] [b][color=Navy]type[/color][/b] TRationalNumber [b][color=Navy]is record[/color][/b] Numerator: Integer; Denominator: Natural; [b][color=Navy]end record[/color][/b]; [b][color=green] ---------------------------------------------------------------------------- -- FUNCTION: "*" -- DESCRIPTION: -- Addition of 2 rational numbers -- PARAMETER: -- +Number1: 1st rat. number -- +Number2: 2nd rat. number -- RETURN: -- Number1 * Number 2 -- NOTES: Result is unabridged ----------------------------------------------------------------------------[/color][/b] [b][color=Navy]function[/color][/b] "*" (Number1, Number2: TRationalNumber) [b][color=Navy]return[/color][/b] TRationalNumber [b][color=Navy]is[/color][/b] Result: TRationalNumber; [b][color=Navy]begin[/color][/b] Result.Numerator := Number1.Numerator * Number2.Numerator; Result.Denominator := Number1.Denominator * Number2.Denominator; [b][color=Navy]return[/color][/b] Result; [b][color=Navy]end[/color][/b] "*"; Rat1, Rat2: TRationalNumber; NewRationalNumber: TRationalNumber; [b][color=Navy]begin[/color][/b] Rat1.Numerator := 4; Rat1.Denominator := 5; Rat2.Numerator := 7; Rat2.Denominator := 12; NewRationalNumber := Rat1 * Rat2; Ada.Integer_Text_IO.Put(NewRationalNumber.Numerator); Ada.Integer_Text_IO.Put(NewRationalNumber.Denominator); [b][color=Navy]end[/color][/b]; |
Re: Operatoren überschreiben
Zitat:
es passt zwar nicht genau zum Thread :oops: Aber eine Frage: Kann ich denn auch einen eigenen Operator definieren? Zum Beispiel:
Code:
var
a , b , c : boolean; begin a := True; b := True c := a [b]NAND[/b] b; end; |
Re: Operatoren überschreiben
Zitat:
|
Re: Operatoren überschreiben
Wenn man eine .NET Anwendung schreibt, dann kann man Operatoren auch schon seit Delphi 8 überschreiben.
|
Re: Operatoren überschreiben
Oder FreePascal benutzen, da geht das auch schon länger ;)
|
Re: Operatoren überschreiben
Man kann auch schon ab Delphi4 (glaube ich) einen eigenen Variant Type definierten und hat dafür dann eine Klasse mit den ganzen Operatoren registrieren. In der Hilfe ist ein Beispiel wie man damit eine Klasse für komplexe Zahlen macht.
|
Re: Operatoren überschreiben
Zitat:
|
Re: Operatoren überschreiben
Korrektur: Ich meine nicht den Parser, sondern genauer den Scanner (das ist die erste Stufe eines Compilers)
|
Re: Operatoren überschreiben
Hallo.
Welche Operatoren kann ich denn alle überschreiben? Ich kenne jetzt aus dem Video nur die Rechenoperatoren mit Namen: add, subtract, multiply, divide, implicit, greaterThan, lessThen, greaterThanOrEqual, lessThanOrEqual und equal. Aber was ist mit den anderen? Es gibt doch mindestens noch or und and, die auch einen Namen haben müssten. Dann kenn ich noch in für Mengen. die ungleich Relation (<>) und viele andere (div, mod, shl und shr, xor, is,...). Wo kann ich eine Liste mit den ganzen Namen dafür kriegen? |
Re: Operatoren überschreiben
Vllt hilft da die Code-Vervollständigung? (Strg+Space wenn du "class operator" schon geschrieben hast)
|
Re: Operatoren überschreiben
Zitat:
|
Re: Operatoren überschreiben
sehr super :thumb: danke.
|
Re: Operatoren überschreiben
Ein Operator fehlt... Ich gehe mal davon aus, dass man @ nicht überschreiben kann?
|
Re: Operatoren überschreiben
Den Adressoperator überschreiben :lol: Guter Witz :)
|
Re: Operatoren überschreiben
Zitat:
|
Re: Operatoren überschreiben
Und wass soll es bringen den @-Operator zu überladen?
|
Re: Operatoren überschreiben
Das typische Einsatzgebiet dafür sind, soweit ich mich da erinnere, Smartpointer. In C++ können Objekte ja einfach auf dem Stack deklariert werden und werden somit automatisch zerstört, wenn sie den Gültigkeitsbereich verlassen. Das Verhalten nutzt man aus, um damit Smartpointer, also intelligente Zeiger, auf Objekte zu implementieren, beispielsweise COM-Objekte. Dabei werden die Operatoren -> und & überschrieben, damit sie die Adresse bzw. die Elemente des COM-Objekts und nicht die der Smartpointer-Klasse zurückgeben. Ich finde das ganze zwar etwas pervers, aber möglich ist es und wirklich dumm auch nicht, ob es in Delphi dafür eine Notwendigkeit gibt, ist eine ganz andere Geschichte :)
|
Re: Operatoren überschreiben
mal 'ne frage, wozu ist eigentlich der Positive Operator?
OK, bei Negative (-x) wird ja der Wert (Vorzeichen) geändert, aber bei Positive (+x) passiert doch nichts :gruebel: |
Re: Operatoren überschreiben
sagen wir mal so, die operatoren auf records kann man seit D2006 überschreiben, die auf objekte geht schon früher :-)
schöne grüsse GG |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 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