Autor Beitrag
FelixD
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 14.01.11 16:07 
Hallo, ich möchte in einer Klasse modint, welche das Rechnen modulo einer Primzahl p wiedergeben soll, den % überschreiben. Der Grund ist, dass dieser auch negative Werte zurück geben kann (z.b. -3 % 2 = -1 statt -3 % 2 = 1).
Nun stehe ich vor folgender Frage: Ich möchte im Body des neuen % Operators den ursprünglichen % Operator verwenden. Ist das möglich und wenn ja wie?

lg Felix

Edit:

Eigentlich weiß ich nicht mal ob man einen Operator lokal überschreiben kann und wie das geht ?
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 14.01.11 16:18 
s. Operator (C# Referenz), nur daß du "Fraction" durch deine eigene Klasse "ModInt" (Klassennamen bitte immer mit Großbuchstabe am Anfang!) ersetzen mußt und dann eben '%' als Operator überlädst.
Intern kannst du dann bei zwei Int-Werten selbstverständlich darauf dann den eingebauten % Operator anwenden.
FelixD Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 14.01.11 16:28 
Ja ich hab den Klassennamen schon bevor du mir geantwortet hast umgeschrieben, weil mir diese Konvention eingefallen ist ;)

Was in diesem Artikel gezeigt wird kenne ich schon. Ich will keinen Operator für zwei ModInts schreiben, sondern wircklich lokal den vorimplementierten Modulo-Operator für ints überschreiben, wobei ich eben zum implementieren des neuen Operators auf den Alten Operator zurückgreifen will. So z.b.:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
static ModInt operator % (int n, int p)
    {
      n=n%p;
      if(n<0)
      { n= p+n; }
      return n;
    }


Also sinngemäß so, den in der vorliegenden Form wird es wahrscheinlich eine Endlosschleife. Oder funktioniert überhaupt nicht ...


Zuletzt bearbeitet von FelixD am Fr 14.01.11 16:52, insgesamt 1-mal bearbeitet
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 14.01.11 16:34 
Sorry, aber das geht nicht. Die vordefinierten Operatoren für die Standardtypen können nicht überladen werden.
Das einzige, was du machen kannst, ist zusätzlich einen expliziten bzw. impliziten Konvertierungsoperator für int nach ModInt anzubieten, s. explicit (C# Referenz) sowie implicit (C# Referenz).

Für diesen Beitrag haben gedankt: FelixD
FelixD Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Fr 14.01.11 16:44 
Aso, naja ist auch nicht allzu tragisch, wäre nur irgendwie schön gewesen ...

Danke für die Hilfe!
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 14.01.11 22:33 
user profile iconFelixD hat folgendes geschrieben Zum zitierten Posting springen:
wäre nur irgendwie schön gewesen ...

Meinst du wirklich? Wenn jemand dann deine Bibliothek einbindet, ändert sich plötzlich das Verhalten eines Systemoperators - glaubst du nicht, dass das für maßlose Verwirrung sorgen würde? Das ist es ja gerade, was C# ausmacht: Dass (möglichst) nichts unerwartetes passiert.