Безопасные массивы (без указателей)

Имеется следующий код:

const int LIMIT = 100;
class safearray
{
    private:
        int start, last;
        int arr[LIMIT];
    public:
        safearray() : start(0), last(100) {}
        safearray(int s, int l) : start(s), last(l) {}
        int& operator[](int n)
        {
            if (last - start > 100 || start > last)
            { cout << "Out of range! Size of your array is " << last - start << endl; exit(1); }
            if (n < start || n >= last)
            { cout << "Wrong index!" << endl; exit(1); }
            return arr[n];
        }
        int getstart()
        { return start; }
        int getlast()
        { return last; }
};

int main()
{
    safearray sa1(100, 175);
    for (int i = sa1.getstart(); i < sa1.getlast(); i++) sa1[i] = i;
    for (int i = sa1.getstart(); i < sa1.getlast(); i++) cout << "Element " << i << " is " << sa1[i] << endl;
}

Если запускать с конструктором, как у меня в примере, компилятор сначала выводит все элементы, а потом ругается:

Run-time check failure #2 - stack around the variable 'sa1' was corrupt.

Не очень понимаю как это исправить

UPD: текст задачи

Дополните класс safearray из программы ARROVER3 этой главы так, чтобы пользователь мог определять и верхнюю, и нижнюю границы массива (например, индексы, начинающиеся с 100 и заканчивающиеся 200). Имеем перегруженную операцию доступа к членам массива, проверяющую индексы каждый раз, когда к массиву нужен доступ, для проверки того, что мы не вышли за пределы массива. Вам понадобится конструктор с двумя аргументами, который определяет верхнюю и нижнюю границы. Так как мы еще не изучили, как выделять память динамически, то данные класса все еще будут размещаться в массиве, состоящем из 100 элементов, но вообще вы можете преобразовывать индексы массива safearray в индексы реального массива целых чисел произвольным образом. Например, если пользователь определил диапазон от 100 до 175, то вы можете преобразовать его в диапазон от arr[0] до arr[75].

а также код ARROVER3

const int LIMIT = 100;
class safearray
{
 private:
 int arr [ LIMIT ];
 public:
_________________________________________________________________ 333
// обратите внимание, что функция возвращает ссылку!
 int& operator[ ] ( int n )
 {
 if ( n < 0 || n >= LIMIT )
 { cout << "\nОшибочный индекс!"; exit ( 1 ); }
 return arr [ n ];
 }
};

int main ( )
{
 safearray sa1;
 // задаем значения элементов
 for ( int j = 0; j < LIMIT; j++ )
 sa1[ j ] = j * 10; // используем функцию слева от знака =
 // показываем элементы
 for ( j = 0; j < LIMIT; j++ )
 {
 int temp = sa1 [ j ]; // используем функцию справа от знака =
 cout << "Элемент " << j << " равен " << temp << endl;
 }
 return 0;
} 

Ответы (1 шт):

Автор решения: Harry

Ваша самая главная ошибка - возврат

return a[n];

в то время как надо

return a[n - start];

И еще - все 100 замените на LIMIT - какой вообще иначе смысл в этом значении?

И - какой смысл в двух конструкторах, если легко обойтись одним -

safearray(int s = 0, int l = LIMIT) : start(s), last(l) {}
→ Ссылка