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

309
13 июня 2022, 07:10

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

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;
} 
Answer 1

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

return a[n];

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

return a[n - start];

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

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

safearray(int s = 0, int l = LIMIT) : start(s), last(l) {}
READ ALSO
С++ Ошибка компилятора. Множественное определение

С++ Ошибка компилятора. Множественное определение

В заголовочном файле создаю объектДалее этот заголовочный файл также подключается в другой заголовочный (там также используется этот созданный...

275
Фабричная функция - шаблон

Фабричная функция - шаблон

Тренируюсь, и хотел реализовать фабричную функцию - шаблон, принимающую любое количество аргументов (вариативность)Алгоритм: шаблон принимает...

304
Какие бывают виды шаблонов (templates) в C++?

Какие бывают виды шаблонов (templates) в C++?

В c++ есть шаблоны классов (сюда же структур) и функцийЯ узнал, что это не все виды шаблонов (templates), но нигде не могу найти остальные

228
Порядок байтов при чтении файла

Порядок байтов при чтении файла

Почему при чтении бинарного файла нет опции для указания порядка байтов? Есть только binary режим, но нет LE или BE

305