/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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?"

Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste