|
| flere kontruktorer med samme type Fra : Thomas Krog |
Dato : 10-12-00 23:52 |
|
her er en halv løsning:
class Matrix{
double data[4][4]; // blot et eksempel
public:
static Matrix translationMatrix(double x, double y, double z);
static Matrix scalingMatrix(double fx, double fy, double fz);
Matrix operator*(const Matrix& m2) const;
};
Matrix Matrix::translationMatrix(double x, double y, double z){
Matrix m;
m.data[3][0] = x;
m.data[3][1] = y;
m.data[3][2] = z;
return m;
}
// tilsvarende med scale
nu ville det så være godt hvis man kunne skrive noget i stil med:
void test(){
using namespace Matrix; // eller på anden måde komme ind i Matrix scopet
Matrix m = translationMatrix(1,2,3)*scalingMatrix(1,2,1);
}
umiddelbart har jeg ikke været i stand til at komme ind i Matrix scopet:
Matrix m = Matrix::translationMatrix(1,2,3)*Matrix::scalingMatrix(1,2,1);
ser lidt grimt ud.
det kan løses ved gøre de 2 funktioner globale men jeg synes nu de hører til
i matrix klassen (ellers bliver der hurtigt overflod af globale funktioner).
en anden løsning var:
Matrix::Matrix(matrixType mt,double x,double y,double z){
switch(mt){
case MATRIX_TYPE_TRANSLATE:
data[3][0] = x;
data[3][1] = y;
data[3][2] = z;
// osv
}
}
men lidt uheldigt med den switch
håber der er nogen der har et forslag til en effektiv løsning som er nem at
bruge (det er vigtigt at den kode som bruger matrix klassen er let læselig)
| |
Igor V. Rafienko (12-12-2000)
| Kommentar Fra : Igor V. Rafienko |
Dato : 12-12-00 17:10 |
|
* Thomas Krog
> class Matrix{
> double data[4][4]; // blot et eksempel
> public:
> static Matrix translationMatrix(double x, double y, double z);
> static Matrix scalingMatrix(double fx, double fy, double fz);
> Matrix operator*(const Matrix& m2) const;
> };
> Matrix Matrix::translationMatrix(double x, double y, double z){
> Matrix m;
> m.data[3][0] = x;
> m.data[3][1] = y;
> m.data[3][2] = z;
> return m;
> }
> // tilsvarende med scale
>
> nu ville det så være godt hvis man kunne skrive noget i stil med:
>
> void test(){
> using namespace Matrix; // eller på anden måde komme ind i Matrix scopet
> Matrix m = translationMatrix(1,2,3)*scalingMatrix(1,2,1);
> }
Jeg jeg tror nok ikke det vil fungere på den måten direkte. Meg kjent
er det bare Simula som har denne egenskapen:
class A;
begin
procedure doIt;
begin
outtext( "foo" ); outimage;
end;
end;
A begin
doIt;
end;
(vel å merke, her kommer man ikke i skopet til klassen A, men heller
et anonymt objekt av typen A (Simula har ikke statiske metoder)).
Det du derimot kan gjøre er å lage namespace matrix, og legge alle
slike funksjoner ditt:
class Matrix { /* ... */ };
namespace matrixops {
Matrix translationMatrix( ... ){}
Matrix scalingMatrix( ... ){}
}
void
foo()
{
using namespace matrixops;
Matrix m = translationMatrix( ... ) * scalingMatrix( ... );
}
Hvis funksjonene må ha kjenskap til intern representasjon i Matrix
gjør du dem til "friends". Ellers kan det være like smart å putte
matrisen i namespace matrixops, da det ser utvilsomt rart ut av
matrisen ligger i det ene navnerommet (nemlig det globale) mens dens
operasjoner ligger i det andre (matrixops).
> umiddelbart har jeg ikke været i stand til at komme ind i Matrix
> scopet:
> Matrix m =
> Matrix::translationMatrix(1,2,3)*Matrix::scalingMatrix(1,2,1);
Like I said -- this won't work.
[snip]
> håber der er nogen der har et forslag til en effektiv løsning som er
> nem at bruge (det er vigtigt at den kode som bruger matrix klassen
> er let læselig)
Som sagt, lag egen namespace hvor alle matriseting havner hen: det man
gjør da er å lage egen matrisepakke. Sounds sensible to me.
ivr
--
Amy: Psst... look what life was like before genetic engeneering.
Leela: Those poor 20th century women...
-- Futurama, "Why must I be a Crustacean in love?"
| |
|
|