Newsgroup: it.comp.lang.c++
Titolo: Restituzione di una matrice

Ciao ragazzi,
supponete che io abbia una classe:
class Punto
{
	private:
		double X[10][10];

Ciao ragazzi,
supponete che io abbia una classe
class miaClasse
{
      private:
          double X[10][10];
      public:
          void cambiaValoriMatrice();
      ...
}
voglio aggiungere un metodo in modo tale che in un'altra classe sia
possibile prendere il riferimento della matrice X.
Mi spiego meglio: voglio che in una classe altraMiaClasse, si possa
1) instanziare miaClasse chiamandola miaIstanza
2) chiamare miaIstanza.cambiaValoriMatrice();
3) chiamare questa funzione che voglio capire come definire per poter
avere accesso alla matrice X al fine di leggerne i valori
E' ovvio che potrei anche istanziare in altraMiaClasse un'altra
matrice 10x10 e fare la copia, ma io "provengo dal java" e lì fare una
getX è molto semplice ed elegante.. qui invece una eventuale
double[10][10] getX(); darebbe errore in compilazione (uso visual
studio)!
Come posso fare?

 Come posso fare?
Non ho verificato se funziona, prova cos�:
class miaClasse
{
public:
	typedef double Matrice [10][10];
private:
	Matrice X;
public:
	void cambiaValoriMatrice();
	// funzione const
	const Matrice& GetX() const {return X;}
	// funzione non-const
	Matrice& GetX() {return X;}
};
o, in alternativa, cos�:
class miaClasse
{
public:
	struct Matrice
	{
		double X[10][10];
	};
private:
	Matrice matrice;
public:
	void cambiaValoriMatrice();
	// funzione const
	const Matrice& GetX() const {return matrice;}
	// funzione non-const
	Matrice& GetX() {return matrice;}
};

> Come posso fare?
Ho fatto una prova scrivendo questo codice che forse fa a caso tuo ma da un 
errore, magari qualcuno sa dirmi il perch�. In pratica nel metodo 
altraMiaClasse::leggiValori() l'istruzione che invoca miaIstanza.getX() 
restituisce valori sbagliati. Ma se invece nel main invoco getX con un 
oggetto di miaClasse, i valori restituiti dal metodo sono corretti.
#include <iostream>
class miaClasse {
      private :
              typedef double Matrice[10][10];
              Matrice X;
      public :
             void cambiaValoriMatrice() {
                  // Codice per cambiare i valori, per esempio assegno dei 
valori
                   for (int i = 0; i < 10; i++)
                       for (int j = 0; j < 10; j++)
                           X[i][j] = (i + 1)*(j + 1);
             }
             Matrice& getX() {
                      return X;
             }
};
class altraMiaClasse {
      private :
              typedef double Matrice[10][10];
              Matrice M;
              miaClasse miaIstanza;
      public :
              void leggiValori() {
                   //Leggo i valori e li memorizzo in M
                   for (int i = 0; i < 10; i++)
                       for (int j = 0; j < 10; j++)
                           M[i][j] = miaIstanza.getX()[i][j];
              }
              Matrice& getM() {
                      return M;
              }
};
int main() {
    miaClasse mC;
    mC.cambiaValoriMatrice();
    altraMiaClasse aMC;
    aMC.leggiValori();
    for (int i = 0; i < 10; i++)
        for (int j = 0; j < 10; j++)
            std::cout << aMC.getM()[i][j] << std::endl;
    return 0;
} 

 
mC e aMC sono due oggetti diversi, quindi contengono variabili diverse.
Su mC hai i valori che ti aspetti perchï¿œ in precedenza hai chiamato
mC.cambiaValoriMatrice();
per cui la matrice ï¿œ stata popolata con i valori impostati dalla 
funzione cambiaValoriMatrice.
Se non chiami quella funzione, la matrice viene inizializzata 
automaticamente con dei valori non definiti.
In generale, nel costruttore bisogna SEMPRE inizializzare tutte le 
variabili della classe.
Nel caso specifico, presumo sia il caso di impostare tutti gli elementi 
della matrice a 0 nel costruttore.

 della matrice a 0 nel costruttore.
Infatti ho aggiunto:
altraMiaClasse::altraMiaClasse() {
                 for (int i = 0; i < 10; i++)
                     for (int j = 0; j < 10; j++)
                         M[i][j] = 0;
             }
E il risultato � sempre lo stesso. 

Ho sistemato il problema. Ho spostato l'istanza di miaClasse all'interno di 
altraMiaClasse e l'invocazione di miaClasse::CambiaValoriMatrice() in 
altraMiaClasse::LeggiValori().
In effetti non mi ero accorto che la matrice che veniva modificata era 
quella dell'oggetto mC nel main e non quella dell'oggetto miaIstanza 
dichiarata in altraMiaClasse.
#include <iostream>
class miaClasse {
    private :
        typedef double Matrice[10][10];
        Matrice X;
    public :
        void cambiaValoriMatrice() {
            // Codice per cambiare i valori, per esempio assegno dei valori
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 10; j++)
                    X[i][j] = (i + 1) * (j + 1);
        }
        Matrice& getX() {
            return X;
        }
};
class altraMiaClasse {
    private :
        typedef double Matrice[10][10];
        Matrice M;
        miaClasse miaIstanza;
    public :
        void leggiValori() {
            // Cambio i valori della matrice di miaClasse
            miaIstanza.cambiaValoriMatrice();
            //Leggo i valori e li memorizzo in M
            for (int i = 0; i < 10; i++)
                for (int j = 0; j < 10; j++)
                    M[i][j] = miaIstanza.getX()[i][j];
        }
        Matrice& getM() {
            return M;
        }
};
int main() {


 mC e aMC sono due oggetti diversi, quindi contengono variabili diverse.
L'errore era dovuto al fatto che avevo invocato il metodo con mC ma leggevo 
i valori con miaIstanza all'interno di altraMiaClasse.