Ritardare la dimensione dell'array nella definizione della classe in C ++?
Domanda
Esiste un modo per ritardare la definizione della dimensione di un array fino a un metodo di classe o un costruttore?
Quello a cui sto pensando potrebbe assomigliare a questo, che (ovviamente) non funziona:
class Test
{
private:
int _array[][];
public:
Test::Test(int width, int height);
};
Test::Test(int width, int height)
{
_array[width][height];
}
Soluzione
Quello di cui parla Daniel è che sarà necessario allocare la memoria per l'array in modo dinamico quando viene chiamato il metodo Test (larghezza, altezza).
Dichiareresti la tua bidimensionale in questo modo (assumendo una matrice di numeri interi):
int ** _array;
E quindi nel tuo metodo Test dovresti prima allocare l'array di puntatori, quindi per ogni puntatore allocare un array di numeri interi:
_array = new *int [height];
for (int i = 0; i < height; i++)
{
_array [i] = new int[width];
}
Quindi, quando l'oggetto viene rilasciato, sarà necessario eliminare esplicitamente la memoria allocata.
for (int i = 0; i < height; i++)
{
delete [] _array[i];
_array [i] = NULL;
}
delete [] _array;
_array = NULL;
Altri suggerimenti
vector è il tuo migliore amico
class Test
{
private:
vector<vector<int> > _array;
public:
Test(int width, int height) :
_array(width,vector<int>(height,0))
{
}
};
Penso che sia tempo per te di cercare i nuovi operatori / eliminare.
Visto che si tratta di un array multidimensionale, dovrai ripetere la chiamata "nuovo" mentre procedi (e di nuovo non dimenticare: elimina).
Anche se sono sicuro che molti suggeriranno di usare un array monodimensionale con elementi larghezza * altezza.
(Mesi dopo) si possono usare i template, in questo modo:
// 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];
}