Ok, klingt sinnvoll. Dann entscheide ich mich für
- Const bei Werttypen weg
- Elementfunktionen sowieso
- Keine Kopien, sondern bestehende Instanz innerhalb der Methode verändern
Wo du gerade von Operatoren sprichst:
Kann es sein, dass die Operatoren +, -, * etc. immer in der Headerdatei deklariert werden müssen oder ähnlich? Vielleicht habe ich auch etwas anderes falsch gemacht, aber VS zickte durchgehend rum bis ich den Code in die Headerdatei verschob.
Kann es momentan leider nicht reproduzieren um eine genaue Fehlermeldung zu zeigen. Deswegen frage ich, ob es bei Operatoren irgendwo diese Muss-Regelung mit dem Code in der Headerdatei gibt.
Jetzt habe ich die Normalize()-Funktion so umgesetzt:
|
C-/C++-Quelltext
|
1
2
3
4
|
void Vector3::Normalize()
{
*this /= sqrtf(x * x + y * y + z * z);
}
|
Sollte man den veränderten Vektor dennoch zurückliefern? Hin und wieder würde man ja nur sagen:
|
C-/C++-Quelltext
|
1
2
|
Vector3 v(20, 30, 50);
v.Normalize();
|
und eigentlich gehört es ja nicht zum guten Ton, den Rückgabewert einfach zu ignorieren, oder?
Würde dann so aussehen, damit ja nicht wieder eine Kopie zurückgegeben wird:
|
C-/C++-Quelltext
|
1
2
3
4
|
Vector3& Vector3::Normalize()
{
return *this /= sqrtf(x * x + y * y + z * z);
}
|
...und angewandt zum Beispiel so:
|
C-/C++-Quelltext
|
1
|
return Vector3(a + s * (b - a).Normalize());
|
Bei einigen Funktionen müsste ich allerdings const bei der Parameterliste auch bei Matrizen und Vektoren rausnehmen, da ich sonst z.B. von einem Vektor die Länge nicht mehr abfragen kann - die Length-Methode ist ja nicht static:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
|
Vector2 Matrix::TransformNormal(const Vector2& v, const Matrix& m)
{
// Vektorlänge berechnen
const float length = v.Length(); // <--- Fehler
[...]
}
|
Was sollte ich nun machen? Ich dachte an folgendes:
- const in der Parameterliste entfernen. Unschön, da uneinheitlich bei den ganzen Matrix-Methoden
- static bei der Length-Methode. Was passiert dann bei Vertizen, die noch garnicht initialisiert sind? Auch irgendwie eine halbe Lösung.
- Ein besserer Lösungsvorschlag, der mir nicht einfällt :/
Gruß,
Pac-Man