Я перегружаю оператора индекса в первый раз, и у меня возникают проблемы при возврате ссылочного значения.
Я следовал эмпирическим правилам из сообщения в C++ faq tag, но есть кое-что, что мне не хватает.Перегрузка оператора в нижнем индексе: возвращаемые опорные задачи
const T& operator[](int index) const {
if ((index < 0) || (index > size)) {
// provide exception handling for this error
std::cout << "Error! Index out of bound." << std::endl;
std::exit(0);
} else {
Block* b = head;
while (b) {
if (b->position == index)
return *b->data;
b = b->next;
}
}
}
Я реализовал их в обоих вариантах: с const
возвращаемого значения и const
функции (как описано выше), так и без (которая идентична для двух const
ключевых слов за исключением).
Проблема в том, что когда я запускаю основную часть теста, она просто падает. Я думал, что ошибка была в заявлении return *b->data;
, но я не могу понять ни того, что может быть, и не ошибаюсь, и есть другие ошибки.
Любые идеи?
Спасибо заранее.
Во-первых, '(индекс> размер)' должен быть '(индекс> = размер)' (или более "визуальный" '(размер <= индекс)'), потому что я предполагаю, что допустимый диапазон для 'index' равен' [0, size-1] '(т.е.' [0, size) '). Во-вторых, что, если выполнение никогда не удовлетворяет условию '(b-> position == index)' и выходит из цикла, когда 'b' становится null? Ничто не будет возвращено функцией, и это неопределенное поведение, вы также должны обработать этот случай ошибок. –
@gx_ Есть ли у вас какие-либо предложения по обработке случая отсутствия возвращаемого значения? Я уже рассмотрел ошибку, но оставил ее для дальнейшего исправления. – Overflowh
Я не знаю внутренности вашего кода ... Если это логически не произойдет (т. Е. Если для каждого допустимого «индекса» предполагается существование равной «позиции» в «Блоке» вашего (что, кажется, a) связанный список) Я полагаю, что вы можете поместить утверждение (или распечатать ошибку и выйти, как указано выше) после тела 'while' (или непосредственно перед концом тела функции). После того, как вы это сделаете, плюс исправление с моего первого комментария, ваша программа все еще падает? и/или распечатывает ли сообщение об ошибке? –