const AnsiString = "Неверный индекс массива (%d).";
template <class T> class TArray
{
private:
T *_fItems;
int _fCount;
protected:
void Error (const AnsiString Message, int Index) // Генерация исключения "Ошибка диапазона"
{throw ERangeError (Message, &TVarRec (Index), 0);
inline void Test_Index (int Index) const // Проверка номера элемента
{if ((Index < 0) || (Index >= _fCount)
this->Error (cseInv_Item_Index, Index;}
public:
inline const T& operator[] (int Index) const // Чтение элемента массива
{this->Test_Index (Index); return _fItems [Index];}
inline T& operator[] (int Index) // Чтение элемента массива для изменения
{this->Test_Index (Index); return _fItems [Index];}
~TArray (void) // Деструктор
{delete[] _fItems;}
TArray (int Count) // Конструктор
{_fItems = new T () [_fCount = Count); } // Пишу по памяти - не пинайте :)
};
//..............
int MyFunction ()
{
TArray<AnsiString> MyArray (10); // Создание массива с 10 элементами
for (int i = 0; i < 20; i++) // Это я типа баг допустил :)
MyArray = i; // Интересующая строка
}
Отображение точки прерывания программы
Объясняю на конкретном примере
Код:
Понятно, что при выполнении цикла в один прекрасный момент возникнет исключительная ситуация. При этом программа остановится, и отладчик переместит точку выполнения в метод Error.
Но мне и без того понятно, что исключение генерируется там. Меня больше интересуют предпосылки генерации :confused: . Как сделать так, чтобы отладчик указывал на строку "MyArray = i;"?
Может быть, существуют директивы, которые позволяют скомпилировать уже проверенные методы объектов без отладочных кодов - таким образом, отладчик не сможет сопоставить надёжный код с текстом, и перенесёт в интересующую нас функцию?