Atraso no tamanho da matriz na definição de classe em C ++?
Pergunta
Existe alguma maneira de atrasar a definição do tamanho de uma matriz até um método de classe ou construtor?
O que estou pensando pode parecer algo assim, que (é claro) não funciona:
class Test
{
private:
int _array[][];
public:
Test::Test(int width, int height);
};
Test::Test(int width, int height)
{
_array[width][height];
}
Solução
O que Daniel está falando é que você precisará alocar memória para sua matriz dinamicamente quando o método de teste (largura, altura) for chamado.
Você declararia seu bidimensional como este (assumindo uma variedade de números inteiros):
int ** _array;
E então, no seu método de teste, você precisaria primeiro alocar a variedade de ponteiros e, em seguida, para cada ponteiro alocar uma variedade de números inteiros:
_array = new *int [height];
for (int i = 0; i < height; i++)
{
_array [i] = new int[width];
}
E então, quando o objeto for liberado, você precisará excluir a memória que você alocou.
for (int i = 0; i < height; i++)
{
delete [] _array[i];
_array [i] = NULL;
}
delete [] _array;
_array = NULL;
Outras dicas
vetor é seu melhor amigo
class Test
{
private:
vector<vector<int> > _array;
public:
Test(int width, int height) :
_array(width,vector<int>(height,0))
{
}
};
Eu acho que é hora de você procurar os novos operadores/excluir.
Vendo que essa é uma matriz multidimensional, você terá que fazer um loop chamando de 'novo' à medida que avança (e novamente para não esquecer: excluir).
Embora eu tenha certeza de que muitos sugerem usar uma matriz unidimensional com elementos de altura de largura*.
(Meses depois) pode -se usar modelos, como este:
// 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];
}