Retarder la taille du tableau dans la définition de classe en C ++?
Question
Y a-t-il un moyen de retarder la définition de la taille d'un tableau jusqu'à une méthode de classe ou un constructeur?
Ce à quoi je pense pourrait ressembler à ceci, ce qui ne fonctionne (bien sûr) pas:
class Test
{
private:
int _array[][];
public:
Test::Test(int width, int height);
};
Test::Test(int width, int height)
{
_array[width][height];
}
La solution
Ce dont parle Daniel, c'est que vous devrez allouer de la mémoire pour votre tableau de manière dynamique lorsque votre méthode Test (width, height) est appelée.
Vous déclareriez vos deux dimensions comme ceci (en supposant un tableau d'entiers):
int ** _array;
Dans votre méthode de test, vous devez d'abord allouer le tableau de pointeurs, puis allouer un tableau d'entiers pour chaque pointeur:
_array = new *int [height];
for (int i = 0; i < height; i++)
{
_array [i] = new int[width];
}
Ensuite, lorsque l'objet sera publié, vous devrez supprimer explicitement la mémoire que vous avez allouée.
for (int i = 0; i < height; i++)
{
delete [] _array[i];
_array [i] = NULL;
}
delete [] _array;
_array = NULL;
Autres conseils
le vecteur est votre meilleur ami
class Test
{
private:
vector<vector<int> > _array;
public:
Test(int width, int height) :
_array(width,vector<int>(height,0))
{
}
};
Je pense qu'il est temps pour vous de rechercher les nouveaux opérateurs / opérateurs de suppression.
Etant donné qu'il s'agit d'un tableau multidimensionnel, vous allez devoir appeler l'appel de "nouveau" au fur et à mesure (et ne pas oublier: supprimer).
Bien que je suis sûr que beaucoup suggéreront d'utiliser un tableau à une dimension avec des éléments width * height.
(Des mois plus tard), on peut utiliser des modèles, comme ceci:
// 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];
}