Я пытаюсь реализовать динамический массив:
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];
}
При таком использовании он работает так, как ожидалось, т.е. печатает 5
:
Array< int > testArray(5);
testArray[0] = 5;
cout << testArray[0] << endl;
Однако я хотел бы использовать класс для двумерного динамического массива. Я думал, что следующий код просто волшебным образом сработает и напечатает 5 ...
Array< Array<int> > testArray(5);
testArray[0][0] = 5;
cout << testArray[0][0] << endl;
... но он не работает. Он вылетает, когда я пытаюсь установить значение в [0] [0]. Отладчик показывает мне, что этот
имеет _size
, установленный на 0, и _array
на NULL
. ] this
в этот момент указывает на первый элемент _array
последнего созданного экземпляра массива.
Одна из вещей, которую я не понимаю, - это когда «внутренний» массив вызывает свой Конструктор. Пошагово просматривая код, я вижу, что Array (int size)
вызывается один раз, а Array ()
пять раз. Я хотел бы создать внутренний массив определенного размера, но используя Array
doe s не компилируется.
Не могли бы вы рассказать мне об этом? Кажется, я еще не мог полностью осмыслить шаблоны ...