¿Retrasar el tamaño de la matriz en la definición de clase en C ++?
Pregunta
¿Hay alguna manera de retrasar la definición del tamaño de una matriz hasta que un método de clase o un constructor?
Lo que estoy pensando podría ser algo como esto, que (por supuesto) no funciona:
class Test
{
private:
int _array[][];
public:
Test::Test(int width, int height);
};
Test::Test(int width, int height)
{
_array[width][height];
}
Solución
De lo que habla Daniel es de que necesitará asignar memoria para su matriz dinámicamente cuando se llame a su método de Prueba (ancho, alto).
Declararías tu bidimensional de esta manera (suponiendo una matriz de enteros):
int ** _array;
Y luego, en su Método de prueba, primero debería asignar la matriz de punteros y luego, para cada puntero, asignar una matriz de enteros:
_array = new *int [height];
for (int i = 0; i < height; i++)
{
_array [i] = new int[width];
}
Y luego, cuando se libere el objeto, deberá eliminar explícitamente la memoria que asignó.
for (int i = 0; i < height; i++)
{
delete [] _array[i];
_array [i] = NULL;
}
delete [] _array;
_array = NULL;
Otros consejos
vector es tu mejor amigo
class Test
{
private:
vector<vector<int> > _array;
public:
Test(int width, int height) :
_array(width,vector<int>(height,0))
{
}
};
Creo que es hora de buscar los operadores nuevos / eliminar.
Como se trata de una matriz multidimensional, tendrá que recorrer la llamada 'nuevo' a medida que avanza (y de nuevo para no olvidar: eliminar).
Aunque estoy seguro de que muchos sugerirán usar una matriz unidimensional con elementos de ancho * alto.
(Meses después) se pueden usar plantillas, como esta:
// array2.c
// http://www.boost.org/doc/libs/1_39_0/libs/multi_array/doc/user.html
// is professional, this just shows the principle
#include <assert.h>
template<int M, int N>
class Array2 {
public:
int a[M][N]; // vla, var-len array, on the stack -- works in gcc, C99, but not all
int* operator[] ( int j )
{
assert( 0 <= j && j < M );
return a[j];
}
};
int main( int argc, char* argv[] )
{
Array2<10, 20> a;
for( int j = 0; j < 10; j ++ )
for( int k = 0; k < 20; k ++ )
a[j][k] = 0;
int* failassert = a[10];
}