2013-05-19 5 views
-3

У меня есть основной файл, который я не могу редактировать. Есть некоторые вещи, которые нужно сделать, и я пишу классы, подходящие для основного файла. Объект v1 является экземпляром моего собственного векторного класса.Исключение исключение из индекса

В какой-то момент у меня есть эта линия.

try { 
    // trying to get the element at(4) 
    // should give an error 
    cout << v1[4] << endl; 
} catch (const string & err_msg) { 
    cout << err_msg << endl; 
} 

Размер моего v1-вектора - «3», поэтому программа рушится, потому что я выхожу из индекса. Здесь ошибка. Но как я могу получить исключение для строки cout до сбоя программы? И мне не разрешено редактировать этот основной код. Мне нужно что-то сделать с моими заголовочными файлами или определениями классов. Благодарю.

+0

Итак, у вас есть собственный класс, а 'v1' - это экземпляр вашего класса? Можете ли вы показать свое определение 'operator []'? –

+0

Если 'v1' является' std :: vector', тогда вы застряли. Вы должны изменить код. – juanchopanza

+0

@ AndyProwl мне нужно перегрузить []? Я не делал ничего особенного для этого оператора. Все, что я делаю, создает собственный вектор v1. – erenkabakci

ответ

1

Без изменения основного кода вы должны написать свой собственный векторный класс, который проверяет границы в operator[].

Что-то вроде:

template <typename T> 
class MyVector 
{ 
    T *data; 
    int length; 

    ... 

    T &operator[](int i) 
    { 
    if (i < 0 || i >= length) 
     throw std::string("Out of bounds!"); //throw std::out_of_range; 
    else 
     return data[i]; 
    } 
    ... 
}; 

В противном случае, если вы используете std::vector, вы можете использовать at вместо []:

Возвращает ссылку на элемент в указанном месте поз. Оценки выполняется проверка, исключение типа std :: out_of_range будет брошенным на недействительный доступ.

+0

, так что я понимаю здесь; Мне нужно перегрузить [], используя функцию(), чтобы проверить границу индекса. Тело метода перегрузки будет вызывать исключение, прежде чем cout выдаст ошибку, не так ли? – erenkabakci

+0

Если вы пишете свой собственный вектор, да перегрузите 'operator []'. Если вы используете 'std :: vector' просто ise' at' метод, который выдает 'std :: out_of_range'. – deepmax

+0

@M M. отлично работает, когда он выходит за пределы. но когда я попробую его с v1 [2], например; Я получаю необработанную ошибку исключения. Является ли возвращаемый тип 'data [i];' true с 'T * data;'? – erenkabakci

Смежные вопросы