2013-06-05 5 views
0

Я перегружаю оператора индекса в первый раз, и у меня возникают проблемы при возврате ссылочного значения.
Я следовал эмпирическим правилам из сообщения в 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;, но я не могу понять ни того, что может быть, и не ошибаюсь, и есть другие ошибки.
Любые идеи?
Спасибо заранее.

+3

Во-первых, '(индекс> размер)' должен быть '(индекс> = размер)' (или более "визуальный" '(размер <= индекс)'), потому что я предполагаю, что допустимый диапазон для 'index' равен' [0, size-1] '(т.е.' [0, size) '). Во-вторых, что, если выполнение никогда не удовлетворяет условию '(b-> position == index)' и выходит из цикла, когда 'b' становится null? Ничто не будет возвращено функцией, и это неопределенное поведение, вы также должны обработать этот случай ошибок. –

+0

@gx_ Есть ли у вас какие-либо предложения по обработке случая отсутствия возвращаемого значения? Я уже рассмотрел ошибку, но оставил ее для дальнейшего исправления. – Overflowh

+1

Я не знаю внутренности вашего кода ... Если это логически не произойдет (т. Е. Если для каждого допустимого «индекса» предполагается существование равной «позиции» в «Блоке» вашего (что, кажется, a) связанный список) Я полагаю, что вы можете поместить утверждение (или распечатать ошибку и выйти, как указано выше) после тела 'while' (или непосредственно перед концом тела функции). После того, как вы это сделаете, плюс исправление с моего первого комментария, ваша программа все еще падает? и/или распечатывает ли сообщение об ошибке? –

ответ

1

Если вы хотите вернуть ссылку на данные, я не уверен, что это то, что вы хотите, вы должны вернуть ссылку типа T, и я предполагаю, что данные имеют тип T, это должно быть что-то вроде:

return b->data; 

Иначе вы возвращаете ссылку на адрес данных.

РЕДАКТИРОВАТЬ: исправлена ​​ошибка

+0

То, что вы говорите, противоречит ссылке. '->' имеет более высокий приоритет, чем '*'. – juanchopanza

+0

oww, извините, это моя ошибка – Nic007

+0

Если я удалю '*' из возврата, я верну эту ошибку: error: недействительная инициализация ссылки типа 'int &' из выражения типа 'int *' '. – Overflowh

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

  • Нет связанных вопросов^_^