[C con Clase] implementacion clase matriz

Steven Davidson srd4121 en njit.edu
Dom Sep 27 18:30:54 CEST 2009


Hola Evelyn,

Evelyn Adaro wrote:
> 
> no sabes cuanto he googleado y aun no encuentro una respuesta.
> , esto es lo que no me deja hacer, 
> Matriz::Matriz(int tam)
> {
> Mat=new Mat[tam][tam];
> 
> }
> Mat esta definido como atributo privado
> 
> 

En primer lugar, 'Mat' es un puntero y no un tipo. Por lo tanto, debería 
ser así:

Mat = new double[tam][tam];

Sin embargo, no puedes usar 'new' para crear un array multidimensional 
directamente. Lo que realmente estás haciendo es crear un array dinámico 
de un array "estático". Esto es,

Mat = new double[tam][10];

Aquí crearías un array dinámico de 'tam' elementos y cada elemento es un 
array [estático] de 10 elementos de tipo 'double'.

Esto es equivalente a hacer esto:

typedef double COLS_T[10];
...
Mat = new COLS_T[tam];

Para lo que quieres hacer tendrás que crear un array dinámico de 
punteros, donde cada puntero apuntará a otro array dinámico. Esto es,

double **Mat;
...
// 'tam' filas
Mat = new double *[tam];

// cada fila tiene 'tam' columnas
for( int i=0; i<tam; i++ )
   Mat[i] = new double[tam];

La primera creación del array, antes del bucle 'for', sirve como 
"directorio". Cada elemento de ese "directorio" apuntará a otro array 
dinámico. Ahora podemos usar 'Mat' casi como un array estático. Por ejemplo,

Mat[0][5] = -.1174;

Esto implica que tienes que liberar la memoria con 'delete[]'. Esto es,

// Libera cada columna
for( int i=0; i<tam; i++ )
   delete[] Mat[i];

// Libera las filas
delete[] Mat;

Existe otra forma, pero creo que esto te servirá para tus fines.


Sugiero que revises el capítulo 17 en nuestro curso de C++. Puedes 
dirigirte a: http://c.conclase.net/curso/index.php?cap=017


Espero que esto aclare la duda.

Steven





Más información sobre la lista de distribución Cconclase