Исходя из фона PHP, я пытаюсь изучать C ++, так как я нахожу это интересным языком.В качестве практики я хочу создать простой класс Vector с использованием шаблонов, что не сложно.Однако я сталкиваюсь с одной проблемой.
Я создал следующий шаблонный класс:
template <typename T>
class Vector
{
public:
Vector(int length);
~Vector(void);
int getLength();
T& operator[] (const int index);
private:
T *_items;
int _count;
};
template <typename T>
Vector<T>::Vector(int length)
{
_items = new T[length];
_count = length;
}
template <typename T>
T& Vector<T>::operator[]( const int index )
{
if (index >= getLength() || index < 0)
throw exception("Array out of bounds.");
return _items[index];
}
Все функции реализованы, но они не относятся к моему вопросу, поэтому я не имеюя скопировал их сюда.
Этот класс работает, как и ожидалось, за одним исключением: если я хочу создать вектор массива, он не будет работать.Например:
Vector<int[2]> someVector(5);
Очевидно, что я хочу, чтобы свойство _items векторного класса было int [5] [2].Однако, поскольку компилятор заменяет 'T' на 'int [2]', свойством _items будет int [2] [5] (или, по крайней мере, это я понял из отладки, пожалуйста, исправьте меня, если я ошибаюсь).В результате оператор [] больше не работает правильно, и поэтому весь этот класс бесполезен для массивов.
Есть ли способ решить эту проблему, чтобы этот класс также работал для массивов?И если это невозможно, есть ли способ предотвратить инициализацию этого класса массивами?
Редактировать: Спасибо за все ваши ответы.Тем не менее, я мог быть не совсем понятен с моим вопросом.Прежде всего, я создал этот класс, чтобы привыкнуть к c ++, я знаю, что есть класс std :: vector, и я также теперь, когда лучше использовать вектор векторов.Это не совсем проблема.Я просто хочу лучше понять шаблоны, и c ++ в целом, поэтому я хочу знать, как решать проблемы такого типа.Я хочу иметь возможность создавать классы, которые не вызывают сбой программы.Если бы я или кто-то другой использовал бы этот класс прямо сейчас и попытался бы использовать примитивные массивы вместо векторов для этого класса, в какой-то момент программа потерпит крах, поскольку массив неверен (Vector (y) становится int [x] [y] вместо int [y] [x] внутри).Поэтому мне нужно решение, которое либо создает правильный массив, либо вообще запрещает инициализацию вектора массивами.