Двумерный массив с использованием шаблонов

Я пытаюсь реализовать динамический массив:

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 (10)> testArray (5) doe s не компилируется.

Не могли бы вы рассказать мне об этом? Кажется, я еще не мог полностью осмыслить шаблоны ...

6
задан fabian789 22 December 2011 в 17:11
поделиться