Eigene Operatoren definieren [gelöst: unmöglich]
-
andi01 schrieb:
das mit dem überladen wäre allerdings ziemlich missverständlich wenn zB der operator + plötzlich ein skalarprodukt errechnet statt zu addieren

Haben ich und meine Vorredner ja auch gesagt
Ich sagte lediglich, dass man es eventuell mal machen könnte wenn nur man selber die Klasse benutzt, aber selbst dann nur wenn das ganze Projekt nicht zu groß ist und alles zu unübersichtlich wird und man vielleicht später selber nicht mehr weiß wieso ein Operator was anderes macht als man eigentlich denkt.Also nehm am besten wie du selbst auch schon gesagt hast ne Funktion.
Lg freeG
-
naja bei den stream klassen ist der << und der >> operator ja auch anders überladen und kein bitshift (oder halt multiplikation mit zweierpotenzen)
bei vektor klassen wird trotzdem gern der multiplizier operator * überladen, einmal zur skalaren multiplikation und einmal zur skalar multiplikation
nur das kreuz und spat produkt muss man dann noch irgendwie auf einen operator bekommen...
-
Skym0sh0 schrieb:
naja bei den stream klassen ist der << und der >> operator ja auch anders überladen und kein bitshift (oder halt multiplikation mit zweierpotenzen)
Wobei >> schon immer fraglich war und man vielleicht unter Umständen ein wenig an Overengeneering denken mag, und << vielleicht mit c++0x gar nicht mehr nötig wäre, zumal solche Sachen wie hex nie so recht gepaßt haben.
-
andi01 schrieb:
das mit dem überladen wäre allerdings ziemlich missverständlich wenn zB der operator + plötzlich ein skalarprodukt errechnet statt zu addieren

Nicht missverständlicher als eine Funktion
add(), die das Skalarprodukt berechnet.Soll heissen, das ist kein Problem, das Operatorüberladung mit sich bringt.
-
v schrieb:
und << vielleicht mit c++0x gar nicht mehr nötig wäre
was hat das mit c++0x zu tun? gibts da iwas neues im bereich der op-überladung bzw der streams? oO
-
unskilled schrieb:
v schrieb:
und << vielleicht mit c++0x gar nicht mehr nötig wäre
was hat das mit c++0x zu tun? gibts da iwas neues im bereich der op-überladung bzw der streams? oO
variadic templates und perfect forwarding und cout.print(a,"+",b,"=",a+b) müßte eigentlich recht schmerzfrei sein.
-
volkard schrieb:
Solche Überlegungen gibt es schon lange. Zum Beispiel http://www2.research.att.com/~bs/whitespace98.pdf
Aber es gibt noch keine Standard-Lösung.
Wenn irgend möglich verzichte auf den Wunsch.... It was therefore decided that the "Max Munch" resolution was unsuitable for large-scale programming. Instead, it was decided to by default limit identifiers to a single character:
int xy; // error: two-character identifier
This may seems Draconian at first . However, since we now have the full Unicode character set available, we don't actually need hard-to-read long names. Such long names only make code obscure by causing unpleasantly long lines and unnatural line breaks. Multi-character names are a relic of languages that
relied heavily on global name and encouraged overly-large scopes.

MfG SideWinder
-
SideWinder schrieb:

Der Grinskopf bekommt eins auf die Fresse? Lieber die Smilies vertauschen...
-
Ach ja, das alte Whitespace-Overloading Prank-Paper...

-
ok, dann bleibe ich eben doch bei funktionen

danke an alle,
andi01.
-
andi01 schrieb:
und ich weiß dass std::vector nicht der mathematische vektor ist, aber er eignet sich gut wenn man vorher nicht weiß wieviele einträge der mathematische vektor haben wird^^
Er eignet sich aber nicht, um davon öffentlich zu erben.
Ist zar ein anderes Thema, aber Deine Klasse sollte wenn einen std::vector 'haben' (nicht so tun als wär sie ein std::vector).
Allerdings weiß ich auch nicht ob es Sinn macht, mathematische Vektoren mit unterschiedlichen Dimensionen den gleichen Typ haben zu lassen. A x B macht keinen Sinn, wenn A eine höhere Dimension hat als B, muss man also immer zur Laufzeit prüfen.
Würde also eher machentemplate<typename T, size_t Dimension> class Vector{ std::array<T, Dimension> elements; /* ... */ };template<typename T, size_t Dim> T DotProduct(const Vector<T, Dim>& a, const Vector<T, Dim>& b) { for(size_t n = 0; n < Dim; ++n) result += a[n] + b[n]; return result; }
-
Für mathematische Vektoren dynamischer Grösse könnte man sich auch das relativ unbekannte Klassentemplate
std::valarrayanschauen. Aber sicher nicht davon erben!
-
Ich kann mich nur Nexus anschließen.
Die template klasse valarray die ist für mathematische vektor operationen.
-
In Haskell und OCaml man beliebige Operatoren definieren...