próbuję wdrożyć dynamiczną tablicę:tablicy dwuwymiarowej przy użyciu szablonów
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];
}
Przy zastosowaniu tak, to działa zgodnie z oczekiwaniami, czyli druki 5
:
Array<int> testArray(5);
testArray[0] = 5;
cout << testArray[0] << endl;
Jednak chciałbym lubię używać klasy do dwuwymiarowej tablicy dynamicznej. Pomyślałem, że następujące po prostu magicznie działają i drukują 5 ...
Array< Array<int> > testArray(5);
testArray[0][0] = 5;
cout << testArray[0][0] << endl;
... ale to nie działa. Zawiesza się, gdy próbuję ustawić wartość na [0] [0]. Debugger pokazuje mi, że this
ma _size
ustawiony na 0 i _array
na NULL
. this
w tym miejscu wskazuje na pierwszy element _array
ostatniej utworzonej instancji macierzy.
Jedną z rzeczy, których nie otrzymuję, jest to, że "wewnętrzna" tablica wywołuje swojego konstruktora. Przechodząc przez kod, widzę, że Array(int size)
jest wywoływany raz i Array()
pięć razy. Chciałbym utworzyć wewnętrzną tablicę o określonym rozmiarze, ale przy użyciu Array< Array<int>(10) > testArray(5)
nie kompiluje.
Czy możesz dać mi wgląd w to? Wygląda na to, że nie mogłem jeszcze nakręcić głowy szablonami ...
Och, nie wiedziałem, że nie można połączyć połączeń z konstruktorami! Teraz utworzyłem prywatną funkcję i teraz działa, ale tylko z rozmiarem określonym w domyślnym konstruktorze. Wszelkie pomysły na tworzenie wewnętrznej tablicy o rozmiarze dynamicznym? – fabian789
Jeśli używasz C++ 11 ** i ** zewnętrzny rozmiar tablicy jest statycznie znany, możesz użyć listy inicjalizatora, aby zapewnić inicjatory dla wszystkich wewnętrznych tablic. W każdym razie, zapomniałem napisać to w mojej odpowiedzi, ale jeśli nie jest to nic innego niż ćwiczenie, prawdziwym rozwiązaniem jest użycie 'std :: vector'. –
Tak, to tylko ćwiczenie. Czy możesz mi powiedzieć, co masz na myśli z "listą inicjalizującą"? używanie '_array = new Item [size] (size);' nie kompiluje się dla mnie. – fabian789