2016-12-11 1 views
2

Я использую классФункция в C++, который может либо вернуть что-то, или ничего

class list 
{ 
    int val; 
    list *next; 
} 

Я хочу, чтобы перегрузить оператор []. Это то, что я придумал:

int & operator [](int n) 

{ 
    list *p; 
    p=this; 
    for(int i=0; i<n; i++) 
    { 
     p=p->next; 
     if(p==NULL) 
     { 
      cout<<"Index out of range "; 
      return ?? ; 
     } 
    } 

    return p->val; 
} 

Мне интересно знать, если есть способ не возвращать ничего в случае, если индекс находится вне диапазона, так как тип значения, возвращаемого в ИНТ &.

ответ

0

Возможные варианты:

  • использование http://en.cppreference.com/w/cpp/utility/optional - вероятно, самый элегантный и современный CPP-путь
  • подготовить «пустой объект» как статический член вашего класса и вернуть ссылку на него (вы также можете вернуться возвращать пару с объектом и логическими переменной информацией, если результат является правильным)
  • возвращает указатель на элемент и nullptr когда нет результата (reather плохого варианта)
+0

* «Возможно, самый элегантный и современный-cpp-way» * - Что еще более важно, это неправильный путь. Если функция не может выполнить обещание, вы делаете исключение. Не превращайте простое правило в переработанный беспорядок, используя все инструменты кровоточащего края, которые у вас есть, только потому, что вы можете. – IInspectable

2

Если «индекс выходит за пределы диапазона», это указывает на основную внутреннюю логическую проблему в коде.

Для этой ситуации на C++ вы можете создать исключение, чтобы указать исключительную ситуацию. Хотя есть определенная школа мысли, которая хмурится использованием исключений, они являются ключевой частью C++, и нет ничего плохого в использовании исключений, где это необходимо.

Если, с другой стороны, ваше приложение не считает, что индекс за пределами диапазона является внутренней логической ошибкой, и вполне может быть ожидаемым условием ошибки, которое должно обрабатываться нормально, один из способов его устранения для вашего operator[], чтобы вернуть объект утилиты, который имеет логический флаг или подходящую именованную функцию, такую ​​как error() и перегрузку operator int(). Таким образом, пользователи operator[] теперь отвечают за выяснение того, как обрабатывать условие ошибки.

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

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