У меня есть этот код, который пытается защитить пользователя от ошибок границ массива.Проблема с изменением константного массива C++
Я не понимаю, почему это скомпилируется, потому что я объявил массив const, поэтому я должен получить ошибку компиляции!
спасибо большое.
/************ file: SafeAccessArray.h ********************/
template<typename T>
class SafeAccessArray
{
private:
int _len;
T * _arr;
public:
SafeAccessArray (int len=2) : _len (len), _arr (new T [len]) {}
~SafeAccessArray() { delete _arr; }
T& operator [](int i) const
{if (i < 0 || i >= _len) throw (-1);
else return _arr[i]; }
};
/************ end of file: SafeAccessArray.h *************/
/************ file: SafeAccessArray1.cpp *************/
#include "SafeAccessArray.h"
int main()`enter code here`
{
SafeAccessArray<int> intArr (2);
intArr[0] = 0;
intArr[1] = 1;
const SafeAccessArray<int> intArrConst (2); // THIS IS THE "PROBLEMATIC" LINE
intArrConst [0] = 0;
intArrConst [1] = 1;
return 0;
}
/************ end of file: SafeAccessArray1.cpp ******/
'SafeAccessArray' нужен оператор копирования и оператор присваивания. Посмотрите на [Правило трех] (http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29) и идиома копирования и свопинга. Даже если это была хорошая идея, просто используйте 'std :: vector' в частном порядке и покончите с этим. Кроме того, не бросайте целые числа, бросайте вещи, происходящие из 'std :: exception'; 'std :: out_of_range' ждет. – GManNickG
Пожалуйста, не бросайте '-1', даже в тестовый код. Throw ':: std :: out_of_range' или что-то еще, кроме простого базового типа, такого как' int' или 'char *', и предпочтительно что-то из ':: std :: exception'. – Omnifarious
Кроме того, новый [] идет с удалением [], а не удаляется. – sellibitze