Hallo,
ich habe eine Frage bezüglich des Überladens eines Cast Operators. Es geht dabei darum, meine eigene Matrix Klasse in eine D3DMATRIX Klasse zu konvertieren.
Das Überladen des Operators sieht z.Z. so aus:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
|
operator D3DMATRIX ()
{
D3DMATRIX m;
m._11 = (float)m11; m._12 = (float)m12; m._13 = (float)m13; m._14 = (float)m14;
m._21 = (float)m21; m._22 = (float)m22; m._23 = (float)m23; m._24 = (float)m24;
m._31 = (float)m31; m._32 = (float)m32; m._33 = (float)m33; m._34 = (float)m34;
m._41 = (float)m41; m._42 = (float)m42; m._43 = (float)m43; m._44 = (float)m44;
return m;
}
|
(die ganzen (float)s sind deshalb da, weil meine Matrix Klasse intern mit double arbeitet, was hier aber nicht weiter stören soll)
Es wird also einfach eine D3DMATRIX Variable erzeugt und alle Komponenten auf die meiner eigenen Matrix Klasse gesetzt. Diese D3DMATRIX wird dann zurückgeliefert.
Brauche ich nun einen D3DMATRIX Pointer, habe jedoch eine Matrix meiner eigenen Matrixklasse, so würde ich im Programm folgendes machen:
|
Quellcode
|
1
|
(D3DMATRIX*)(&(D3DMATRIX)mMeineMatrix)
|
Dort nimmt er meine Matrix (mMeineMatrix), konvertiert sie in eine D3DMATRIX (mit dem oben genannten überladenen Operator), nimmt dann die Adresse der Matrix (&) und konvertiert diese widerum in einen D3DMATRIX Zeiger.
Diese Zeile funktioniert, kommt mir aber irgendwie ganz böse vor ;-) Sieht sehr schlecht programmiert aus...
Nun dachte ich mir, ich überlade den Operator so, dass man gleich einen D3DMATRIX Pointer erhält, was dann so aussah:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
|
operator D3DMATRIX* ()
{
D3DMATRIX m;
m._11 = (float)m11; m._12 = (float)m12; m._13 = (float)m13; m._14 = (float)m14;
m._21 = (float)m21; m._22 = (float)m22; m._23 = (float)m23; m._24 = (float)m24;
m._31 = (float)m31; m._32 = (float)m32; m._33 = (float)m33; m._34 = (float)m34;
m._41 = (float)m41; m._42 = (float)m42; m._43 = (float)m43; m._44 = (float)m44;
return &m;
}
|
Also fast wie oben, jedoch wird die Adresse der Matrix zurückgegeben. Leider ist dies auch nicht sehr fein, denn es wird die Adresse einer lokalen Variable zurückgegeben.
Deshalb von mir die Frage, wie würdet ihr das lösen? Ist diese Cast-Zeile oben gut so, oder würdet Ihr vielleicht einen anderen Code für das Casten in ein D3DMATRIX Zeiger verwenden bzw. wie sieht so ein überladener Operator aus? Ziel wäre es ja, einfach das hier machen zu können:
|
Quellcode
|
1
|
(D3DMATRIX*)mProjection
|
oder auch
|
Quellcode
|
1
|
(D3DMATRIX*)&mProjection
|
Würde mich sehr freuen, wenn Ihr mir dazu ein paar Tipps gebt oder Vorschläge macht.
(P.S. Ich möchte meine eigene Matrix Klasse nicht auf float umstellen)
Vielen Dank!
Grüsse,
Timo