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];
}
È stato utile?

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top