Sto cercando di implementare un array dinamico:matrice bidimensionale utilizzando i modelli
template <typename Item>
class Array {
private:
Item *_array;
int _size;
public:
Array();
Array(int size);
Item& operator[](int index);
};
template <typename Item>
Array<Item>::Array() {
Array(5);
}
template <typename Item>
Array<Item>::Array(int size) {
_size = size;
_array = new Item [size];
for (int i = 0; i < size; i++)
cout << i << " " << _array[i] << " " << &_array[i] << endl;
}
template <class Item>
Item& Array<Item>::operator[](int index) {
if (index < 0 || index > _size-1)
cout << "this: " << this << ". Index out of range" << endl;
return _array[index];
}
Quando viene usato in questo modo, funziona come previsto, vale a dire stampe 5
:
Array<int> testArray(5);
testArray[0] = 5;
cout << testArray[0] << endl;
Tuttavia, vorrei piace usare la classe per un array dinamico bidimensionale. Ho pensato che il seguente avrebbe funzionato e stampato magicamente 5 ...
Array< Array<int> > testArray(5);
testArray[0][0] = 5;
cout << testArray[0][0] << endl;
... ma non funziona. Si blocca quando provo a impostare il valore su [0] [0]. Il debugger mi mostra che this
ha _size
impostato su 0 e _array
su NULL
. this
in quel punto punta al primo elemento di _array
dell'ultima istanza di Array creata.
Una delle cose che non ottengo è quando l'array "interno" chiama il suo costruttore. Passando attraverso il codice, vedo che Array(int size)
viene chiamato una volta e Array()
cinque volte. Vorrei creare l'array interno con una dimensione specifica, ma l'utilizzo di Array< Array<int>(10) > testArray(5)
non viene compilato.
Potresti fornirmi qualche informazione su questo? Sembra che non riesco ancora a spiegarmi i modelli ...
Oh, non sapevo che non potevi associare le chiamate del costruttore! Ora ho creato una funzione privata e ora funziona, ma solo con le dimensioni specificate nel costruttore predefinito. Qualche idea su come creare l'array interno con una dimensione dinamica? – fabian789
Se si utilizza C++ 11 ** e ** la dimensione dell'array esterno è staticamente nota, è possibile utilizzare un elenco di inizializzatori per fornire gli inizializzatori per tutti gli array interni. Ad ogni modo, ho dimenticato di scriverlo nella mia risposta, ma a meno che questo non sia altro che un esercizio, la vera soluzione è usare 'std :: vector'. –
Sì, è solo un esercizio. Potresti dirmi cosa intendi con "lista di inizializzazione"? usando '_array = new Item [size] (size);' non mi viene compilato. – fabian789