Имеется следующий код:
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;
}
Ваша самая главная ошибка - возврат
return a[n];
в то время как надо
return a[n - start];
И еще - все 100 замените на LIMIT - какой вообще иначе смысл в этом значении?
И - какой смысл в двух конструкторах, если легко обойтись одним -
safearray(int s = 0, int l = LIMIT) : start(s), last(l) {}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей