Newsgroup: it.comp.lang.c++
Titolo: E' possibile un puntatore ad una classe ?







Ciao. Sono uno studente universitario, 
attualmente in tesi.


Volevo chiedervi se potevate 
aiutarmi in un problema C++ (che io non conosco: ho appena iniziato a 
studiarlo): 
è possibile definire un puntatore ad una classe 
?


Vi spiego meglio il 
problema.


Devo fare il passaggio di parametri ad una 
funzione per indirizzo (o referenza, non so come si dica). Infatti le funzioni 
in C permettono di restituire solo un parametro, mentre io ne devo restituire 
più di uno. Ho pensato così dal main di fare il passaggio per 
indirizzo, usando i puntatori. Volevo chiedervi se quello che ho fatto è 
corretto oppure no.


 


Supponiamo che debba passare 
per indirizzo una variabile di tipo double. Nel main dichiaro:


double v;


 


Poi ho la funzione chiamata f che riceve questo 
parametro; essa deve ricevere il puntatore alla variabile v. Perciò il 
prototipo di f deve essere del tipo:


 


void f (double* v_ptr)


 


Nel main chiamo f nel seguente 
modo:


 


f (&v);


 


In questo modo nella funzione f lavoro su *v_ptr 
e così nel main ho la variabile v modificata.


 


Fin qua non credo di aver commesso errori. I 
problemi nascono dal fatto che io devo usare una libreria C++, che mi mette a 
disposizione dei comandi per manipolare facilmente le matrici. 


Vorrei sapere se utilizzo correttamente la 
libreria C++. Questa definisce una classe chiamata 'matrix'  per dati di 
tipo double; per dichiarare una matrice M di dimensioni 5x3 bisogna 
usare:


 


matrix M(5,3);


 


Per accedere all'elemento in posizione riga 1 
colonna 3 bisogna usare:


 


M(1,3)


 


Io devo fare il passaggio per indirizzo della matrice 
M.


Definisco una funzione f con il prototipo


 


void f ( matrix* 
M_ptr)


 


Nel main definisco 


 


matrix M(5,3);


 


Dal main chiamo con


 


f ( &M );


 




mentre in f lavoro su *M_ptr.


E' corretto ? 


Il mio dubbio è se è possibile definire nel 
prototipo di f un puntatore ad una classe.


Inserisco alla fine il file header della classe, nel caso 
possa servire.


 


Grazie mille.


 


Giancarlo Penza


pe...@tin.it


 


 


 


 


 


class matrix{
 friend class 
cmatrix;
 friend class imatrix;
protected:
  int  
M;   // number of rows
  int  N;   // number of 
columns
  double  *X;


 


public:


 


  matrix ();
  matrix (int m, int 
n=1);
  matrix (const matrix &a);
  matrix (const imatrix 
&a);
 ~matrix ();


 


  matrix& operator  = (const 
matrix& a);
  matrix& operator  = (const imatrix& 
a);
  double&        operator () 
(int i,int j) const;
  
double&        operator () (int i) 
const;


 


 friend matrix operator +(const 
matrix&, const matrix&);
 friend matrix operator -(const 
matrix&, const matrix&);
 friend matrix operator -(const 
matrix&);
 friend matrix operator *(double, const 
matrix&);
 friend matrix operator *(const matrix&, 
double);
 friend matrix operator *(const matrix&, const 
matrix&);
 friend double **array(const matrix& a); //make matrix 
a(m,n) into array aa[][] for
      //faster 
addressing.
 friend matrix operator /(const matrix&, const 
matrix&);  
 friend matrix operator /(double,const 
matrix&);  
 friend matrix operator /(const matrix&, 
double);  


 


 friend matrix operator |(const 
matrix&, const matrix&);  //or
 friend matrix operator 
&(const matrix&, const matrix&);  //and
 friend matrix 
operator ^(const matrix&, const matrix&);  //X-or


 


 friend int operator ==(const matrix&, 
const matrix&);  
 friend int operator !=(const matrix&, 
const matrix&);  


 


 friend matrix abs(const matrix &a); 

 friend double norm(const matrix &a); //sqrt(sum a(i,j)*a(i,j)) 

 friend double normsq(const matrix &a); //sum a(i,j)*a(i,j) 

 friend double det(const matrix &a); 
 friend matrix 
diag(const matrix &a); 
 friend matrix init(matrix& a, double x 
...);
 friend matrix identity(int); 
 friend matrix joinr(const 
matrix &a, const matrix &b); //right join matrices a,b as (a 
b)
 friend matrix joinr(const matrix &a, double b); //right join 
row-vector a 
        //with double b as 
(a b)
 friend matrix joinr(double a, const matrix & b); //right join 
double a 
        //with row-vector b as 
(a b)
 friend matrix joind(const matrix &a, const matrix 
&b);
// friend matrix joinl(const matrix &a, const matrix &b); 
//lower join matrices a,b as 
|a|
         //    |b| 

 friend matrix joind(const matrix &a, double b);  //lower join 
column-vector a   
|a|
         //with double b 
as     |b|
 friend matrix joind(double a, const 
matrix& b);  //lower join double a with    
|a|
         //column-vector b 
as   |b|
 friend void phasecontinue(const matrix& 
p);
 friend void phasefollow(const matrix& p1,const matrix& 
p2);
 //p1 follows p2.


 


 friend matrix shiftl(const 
matrix&);//shift left
 friend matrix shiftr(const 
matrix&);//shift right
 friend matrix shiftu(const 
matrix&);//shift up
 friend matrix shiftd(const matrix&);//shift 
down
 friend matrix sub(const matrix& a, int m1, int n1, int m2, int 
n2);//Take submatrix 
    //beginning at a(m1,n1) and ending 
at a(m2,n2)
 friend matrix TT(const matrix&);  
//transpose
 friend void printf(const matrix &a);  
//Usage:printf(a)
 friend void printw(const matrix &a);  
//Usage:printf(a)
 friend void fprintf(FILE *fp,const matrix 
&a);  //Usage:fprintf(fp,a)
 friend void fscanf(FILE *fp, 
matrix &a);  //Usage:fscanf(fp,a)


 


 friend double Max(const matrix 
&a);
 friend double Min(const matrix &a);
 friend double 
Max(const matrix &a, double &y_max, int &i_max, int 
&j_max);
 friend double Min(const matrix &a, double &y_min, 
int &i_min, int &j_min);


 


 friend matrix convol(const matrix &x, 
const matrix &y);


 


 friend void plot(const matrix 
&a);
 friend void plot(const matrix &a, const matrix 
&b);
 friend void plot(const matrix &a, const matrix &b1, 
const matrix &b2);
 friend void plot(const matrix &a, const 
matrix &b1, const matrix &b2, const matrix &b3);
 friend 
void plot(const matrix &a, const matrix &b1, const matrix &b2, const 
matrix &b3, const matrix &b4);
 friend void plot(const matrix 
&a, const matrix &b1, const matrix &b2, const matrix &b3, const 
matrix &b4, const matrix &b5);


 


 friend matrixn corr(const matrix& x, 
const matrix& y);
 friend matrixn corrnorm(const matrix &x, 
const matrix &y);


 


 friend void eigen(matrix &aa, matrix 
&d, matrix &z); 
        //for 
symmetric matrix only
 friend void eigen(matrix &aa, cmatrix &d, 
cmatrix &z); 
        //for general 
matrix aa


 


 friend double sum(const matrix &a); 

 friend double mean(const matrix &a); 
 friend double 
var(const matrix &a);  //variance


 


 friend void fprintf(char *file, const 
matrix& a);
 friend void fscanf(char *file, matrix 
&a);


 


 friend cmatrix fft(const matrix 
&h);
 friend matrix select(int k,  const matrix & 
a);
 friend double median(const matrix &a);
 friend double 
t_stat(const matrix & data1,  const matrix & 
data2);
 friend double t_test(const matrix & data1,  const 
matrix & data2);
 friend double t_testv(const matrix & data1, 
const matrix & data2);
 friend double t_statv(const matrix & 
data1, const matrix & data2);
 friend double f_test(const matrix 
& data1, const matrix & data2);
 friend double f_stat(const 
matrix & data1, const matrix & data2);
 friend void 
pdf(matrix& a, matrix& x, matrix& y, int n=10);


 


 friend void plot3(const matrix &x, 
const matrix &y, const matrix &z);
 friend void plot3(const 
matrix &x, const matrix &y, const matrix &z,char 
*legend);
 friend void plot3t(const matrix &a, const matrix 
&b,
       double max_x2,double 
max_y2,double min_x2,double min_y2);
 friend void plot3(const matrix 
&z1, const matrix &x1, const matrix &y1,const matrix &z2, const 
matrix &x2, const matrix &y2);
 friend void plot3(const matrix 
&z1, const matrix &x1, const matrix &y1,char 
*legend1,
        const matrix &z2, 
const matrix &x2, const matrix &y2,char *legend2);
 friend void 
plot3t(const matrix &a, const matrix &b1, const matrix &b2, 

        double max_x2,double 
max_y2,double min_x2,double min_y2);


 


 friend cmatrix czt(const matrix &x, 
int m, const Complex &w, const Complex &a);


 


};/*end of 
class*/



 E' corretto ?
Si. Ma ci sono alcune cose da precisare:
1. Normalmente si usa la sintassi M_ptr -> metodo().
2. Se vuoi per forza dereferenziare l'oggetto allora devi utilizzare la
sintassi (*M_ptr).metodo().
3. In alternativa utilizza i reference (void f( matrix &M )) utilizzando
poi nella funzione la sintassi M.metodo().
EMG