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