Глава 16. Перегрузка операций________________________________387
Маловероятно, что столь явное нарушение реально будет иметь место. Очевидное решение состоит в том, чтобы проверять индекс на попадание в границы массива прежде, чем использовать его.
! Предупреждение
Массивы в C++, как и в С, нумеруются от нуля. Поэтому наибольший элемент— это максимальное значение минус единица. В массиве из 100 элементов индексы изменяются от 0 до 99. Переход через максимум приводит к использованию чужой области памяти.
Один из вариантов — введение условного оператора if
if ( j>=0 &s j< size(array)/sizeof(array[0])) array =1944;
Дополнительно можно использовать определенный в assert.h макрос assert, Этим будет обеспечено немедленное извещение о попытке применения
неправильного индекса. Вот фрагмент кода с такой защитой:
*
// ttdefine NDEBUG // для отключения макроса assert снимите комментарий
#include <assert.h>
assert ( j>=0 &s j < sizeof (array)/sizeof (array[0]));
if ( j >=0 && j < sizeof (array)/sizeof (array[0])) array [j] = 1944;
Кроме того, что программа будет контролироваться проверкой оператора if, утверждение (assert) будет прерывать выполнение программы, позволяя выяснить причины ошибки.
Если бы все поступали так, многие ошибки в программах были бы исключены. Человеку свойственно ошибаться, поэтому со всех точек зрения было бы хорошо придумать средство, которое гарантировало бы (хотя бы на этапе разработки) допустимость индексов для всех используемых массивов. Рассмотрим одно из возможных решений проблемы запредельных индексов.
Массив с контролем границ. Проблема, которой мы здесь займемся — выход индекса за границы массива. Попытаемся связать проверку границ с процессом обращения к массиву. Первым шагом будет встраивание проверки в каждое обращение к массиву.
Для этого можно перегрузить индексную операцию для каждого класса, содержащего массивы любого нужного нам типа. Листинг 16.2 показывает определение класса в отдельном заголовочном файле.
1: // SMARRAY1.H — Определение класса интеллектуального массива
2: // Copyright (с)1995. All Rights Reserved.
3: //By Paul Kimmel