Имеется следующий код:
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) {}
В заголовочном файле создаю объектДалее этот заголовочный файл также подключается в другой заголовочный (там также используется этот созданный...
Тренируюсь, и хотел реализовать фабричную функцию - шаблон, принимающую любое количество аргументов (вариативность)Алгоритм: шаблон принимает...
В c++ есть шаблоны классов (сюда же структур) и функцийЯ узнал, что это не все виды шаблонов (templates), но нигде не могу найти остальные
Почему при чтении бинарного файла нет опции для указания порядка байтов? Есть только binary режим, но нет LE или BE