2009-03-05 9 views
5

C'è un modo per ritardare la definizione della dimensione di un array fino a un metodo di classe o un costruttore?Ritardare la dimensione dell'array nella definizione della classe in C++?

Quello che sto pensando potrebbe apparire qualcosa di simile, 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]; 
} 

risposta

8

Ciò di cui Daniel sta parlando è che è necessario allocare la memoria per l'array in modo dinamico quando viene chiamato il metodo Test (larghezza, altezza).

Si potrebbe dichiarare la vostra bidimensionale come questo (assumendo array di interi):

int ** _array; 

E poi nel metodo di prova si avrebbe bisogno di allocare prima l'array di puntatori, e poi per ogni puntatore allocare un array di interi:

_array = new *int [height]; 
for (int i = 0; i < height; i++) 
{ 
    _array [i] = new int[width]; 
} 

E poi quando l'oggetto viene rilasciato dovrai esplicita cancellare la memoria allocata.

for (int i = 0; i < height; i++) 
{ 
    delete [] _array[i]; 
    _array [i] = NULL; 
} 
delete [] _array; 
_array = NULL; 
+0

Potrebbe aggiungere l'assegnazione di matrice puntatore: _array = new int [altezza ]; Votato per la fornitura di fonte però! –

+0

Oops. Grazie Daniele. Ho dimenticato di aggiungere quello :). Saluti. – RedBlueThing

+0

Il problema con la gestione di array di manuall è il fatto che è necessario creare i propri costruttori/operatore = o della propria copia costruttore/operatore = o rendere la classe esplicitamente non copiabile per evitare problemi futuri – Artyom

2

Credo che sia il momento per voi di cercare il nuovo/cancellare gli operatori.

Visto che si tratta di un array multidimensionale, si sta andando ad avere per scorrere chiamare 'nuovo', come si va (e ancora una volta non dimenticare: cancellare).

Anche se sono sicuro che molti suggeriranno di utilizzare un array unidimensionale con elementi di larghezza * altezza.

8

vettore è il tuo migliore amico

class Test 
{ 
    private: 
    vector<vector<int> > _array; 

    public: 
    Test(int width, int height) : 
     _array(width,vector<int>(height,0)) 
    { 
    } 
}; 
+1

Artyom ha assolutamente ragione. Salva te stesso un mucchio di dolore :). Tuttavia, immagino sia bene capire i principi di base. – RedBlueThing

+0

In termini di strutture dati, sembra che un vettore sia ancora strutturalmente un array ma inserito in una classe. Si? – slythfox

+0

Sì, la maggior parte delle implementazioni vettoriali utilizzano gli array "dietro le quinte", penso. È inoltre possibile utilizzare gli operatori di array per manipolare un vettore. – gnud

1

(mesi dopo) si possono utilizzare i modelli, 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]; 

}