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];
}
Était-ce utile?

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];

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top