Sauber Klasse?
-
op+, op* etc gehören nicht in die Klasse. Sollten freie Funktionen sein. Genauso einige andere Funktionen. Zum Beispiel angleWith... warum nicht als frei Funktion mit zwei Argumenten?
-
Wenn du schon Inline Assembler benutzt, dann kommentier auch was der macht. Das (*this) ist extrem unleserlich und daraus folgt schlecht. Privat kannst du das machen, aber wenn du dich bewerben willst, lass so ein Blödsinn weg.
Dann ist dein Code nicht const-correct und ich würde eine Menge hier inlinen.
Dann solltest du nicht alle Operatoren als Member implementieren (siehe http://www.gotw.ca/gotw/004.htm).
void würde ich an deiner Stelle nicht mehr explizit bei Parametern angeben!
Und du verletzt das OpenClosed Prinzip.
-
Jester schrieb:
op+, op* etc gehören nicht in die Klasse. Sollten freie Funktionen sein. Genauso einige andere Funktionen. Zum Beispiel angleWith... warum nicht als frei Funktion mit zwei Argumenten?
weil ich nicht umbedingt immer sowas schreiben wollte:
vector angle (0,0,0; angle = angle2 (vector1, vector2);
-
kingruedi
Danke für die Hinweise, doch da muss ich etwas "nachharken":
1. Was genau ist nicht "const-correct".
2. Womit verstoße ich (neben der Globalen Variable) das OCP?
3. Die Sache mit dem void, was hat es damit auf sich?naja das mit den Operatoren wusste ich nicht, aber man lernt nie aus
und das mit inline kommt noch
Danke für den Hinweis
-
nix da schrieb:
kingruedi
Danke für die Hinweise, doch da muss ich etwas "nachharken":
1. Was genau ist nicht "const-correct".Steht doch in dem Link.
2. Womit verstoße ich (neben der Globalen Variable) das OCP?
Die globale Var. hat damit nichts zu tun. Bei dir is alles public.
[/quote]3. Die Sache mit dem void, was hat es damit auf sich?
Es ist überflüssig und sieht IMHO hässlich aus.
-
1. Member Funktionen, die das Objekt nicht verändern solltest du als const deklarieren. Siehe auch den Link
2. Die Variablen sind in der public Schnitstelle. Auch hier solltest du den Link lesen
3. Du kannst einfach void foo() anstelle void foo(void) schreiben, dass ist IMHO leserlicher. void als Parameter ist ein überbleibsel aus alten C Zeiten, da eine leere Parameterliste AFAIK beliebige Parameter bedeutete.
-
kingruedi schrieb:
2. Die Variablen sind in der public Schnitstelle. Auch hier solltest du den Link lesen
Naja ich wollte es eigentlich konfortabel halten und nicht immer sowas machen:
float _31 = vector.getX();
Das würde bei einer 4x4 Matrix schon sehr auf die Performance hauen, sofern ich mir das Logisch zusammen wurschtel, vorallem bei Matrizenmulitplikationen. Währe es zu Sachen des "Speeds" nicht logisch das OCP zu "sträken"? Denn ich weis nicht eine get_32() funktion bei einer Matrixklasse fände ich extrem bäh.
zum void: ich finde das bei Syntaxhighlight schöner und erkennlicher, aber jedem das seine, denkst du das ist ein Starkes Kriterium?
-
kingruedi schrieb:
void als Parameter ist ein überbleibsel aus alten C Zeiten, da eine leere Parameterliste AFAIK beliebige Parameter bedeutete.
Das ist heute immer noch so. Wo da der Sinn ist, würde mich aber interessieren. Oder kommt das einem void func(...); gleich? .oO(geht das eigentlich? hab ich noch nie gesehen...)
-
@Nix da:
währe?? sträken?? weis ??
Du nix Deutsch
-
Also ich finde das inline-Asm für das Kreuzprodukt und den Betrag kannst du dir sparen. Wird nichts an Performance bringen bei so einfachen Berechnungen.
-
nix da schrieb:
float _31 = vector.getX();
Das würde bei einer 4x4 Matrix schon sehr auf die Performance hauen, sofern ich mir das Logisch zusammen wurschtel, vorallem bei Matrizenmulitplikationen.
Nein. getX() ist eine inline-Funktion, daher generiert diese Zeile exakt den gleichen Code wie:
float _31 = vector.x;
-
boah, ich dachte "nix da" kennt sich aus.
Und dann macht er soviele Fehler.
-
leicht enttäuscht schrieb:
boah, ich dachte "nix da" kennt sich aus.
Und dann macht er soviele Fehler.
und Deutsch kann er auch nicht
-
@DrGreenthumb
auch in C++? Hab mir das () mal angewöhnt, weil volkard sonst nie meinen Code lesen wollteAber ich weiss nicht wie man auf die Liste zugreifen sollte, da va_start ja den letzten Parameter vor der Liste erwartet.
-
nix da schrieb:
weil ich nicht umbedingt immer sowas schreiben wollte:
vector angle (0,0,0; angle = angle2 (vector1, vector2);
Häh? seit wann ist denn ein Winkel ein Vektor???
double theta = angle(vector1,vector2);
fertig.
Und was ist mit op+, op*? die sollten über die entsprechenden op+= bzw. op*= implementiert sein (diese wiederum dann als Member).
-
cd9000 schrieb:
Nein. getX() ist eine inline-Funktion, daher generiert diese Zeile exakt den gleichen Code wie:
float _31 = vector.x;
Naja aber sind wir doch mal ehrlich: Würdest Du sowas machen bei einer Matrixklasse in einer Matrizenmultiplikationsfunktion? Wenn ja biste echt ein C++ Hoschi
(nichts für Ungut aber man kann es auch etwas "übertreiben")
Jester
Also sollte man als "Faustregel" es so ausdrücken: op+-/ sollen "normale" Funktionen sein und op +-/= in die Klasse implementiert werden. Sehe ich das richtig?Und op+-/ sollen per op+-/= implementiert werden?
-
-
nix da schrieb:
Also sollte man als "Faustregel" es so ausdrücken: op+-/ sollen "normale" Funktionen sein und op +-/= in die Klasse implementiert werden. Sehe ich das richtig?
Und op+-/ sollen per op+-/= implementiert werden?
Ja, das ist gut.
Grund ist, daß dadurch sicher gestellt ist, daß Operatoren mit gleichem Namen auch das gleiche tun. Achte auch darauf die korrekten Rückgabewerte zu verwenden.op+= sollte als Rückgabe ne const& haben, op+ ein const-Objekt. Andere analog.
MfG Jester
-
Jester schrieb:
op+= sollte als Rückgabe ne const& haben, op+ ein const-Objekt. Andere analog.
Darüber lässt sich streiten. Schließlich sollte man sich ja an den Spruch "Do
as the ints do" halten und sowas geht ja auch:int j=0; (j+=2)=3;
-
nix da schrieb:
kingruedi schrieb:
2. Die Variablen sind in der public Schnitstelle. Auch hier solltest du den Link lesen
Naja ich wollte es eigentlich konfortabel halten und nicht immer sowas machen:
float _31 = vector.getX();
Das würde bei einer 4x4 Matrix schon sehr auf die Performance hauen, sofern ich mir das Logisch zusammen wurschtel, vorallem bei Matrizenmulitplikationen. Währe es zu Sachen des "Speeds" nicht logisch das OCP zu "sträken"? Denn ich weis nicht eine get_32() funktion bei einer Matrixklasse fände ich extrem bäh.
zum void: ich finde das bei Syntaxhighlight schöner und erkennlicher, aber jedem das seine, denkst du das ist ein Starkes Kriterium?
1. schonmal was von inline gehoert? ein vector.getX() kann genauso schnell sein wie ein vector.x
2. void foo(void) ist C, und in C++ ist dafuer ausdruecklich void foo() vorgesehen.