2016-03-29 2 views
0

Когда в C++ встречается исключение, программа автоматически завершается при ее обнаружении. Есть ли способ, который, если бы исключение попало в цикл, я мог бы просто пропустить остальную часть цикла и перейти прямо к следующей итерации?C++ - Продолжение цикла while после исключения

+0

Можете ли вы опубликовать код функции advance(). – Winter

+0

Поместите еще один цикл «if», который проверяет, есть ли «в! =« Юг »- и помещает два оператора в состояние, чтобы оно выполнялось, только если« in »не равно югу. – Maertin

+2

Исключения обрабатываются блоками 'try'' catch'. Я не могу распознать их в вашем коде. –

ответ

0

Ну, в первую очередь, если этот отрезанный код ТОЧНО, как вы его скопировали, он имеет некоторые синтаксические ошибки. Вот как это должно быть написано:

 int main() { 
    ... 
    Person *p = new Person("Neo"); 
    ... 
    string in; 
    while(cin >> in) { 
     if (in == "q") { 
     break; 
     } 
     else if (in == /*One of the eight directions North ... Northwest*/) { 
     p->advance(in); 
     } //this bracket here ends the if. after the parentheses, nothing else will execute 
     else { 
     cerr << "Input one of the eight directions" < endl; 
     } 
    } 
    } 

Так что да, если я правильно понял вашу проблему, добавив, что закрывающая скобка должна решить. Я надеюсь, что это то, что вам нужно, и что было полезно

+0

Единственной синтаксической ошибкой является отсутствующая точка с запятой после 'p-> printBoard()'. Устранение вызовов 'system (" clear ")' и 'p-> printBoard()' не решает проблему. –

+0

Это было не единственное, что я изменил. Хотя это и не было технически неверным, я изменил второй «if» на «else if» и комментарий «один из восьми ....» в комментарий/* * /, поскольку он менял открытый брэкет –

1

Существует несколько способов решения этой проблемы.

  • Создайте функцию-член, которая проверяет, действителен ли переход до его создания. Вызывающий код должен будет вызвать эту функцию перед вызовом advance и только позвонить advance, если это действие действительно.

  • Выполнение функции-члена advance возвращает значение, указывающее, была ли продвинута позиция игрока. Вызывающий код должен будет проверить возвращаемое значение, чтобы решить, следует ли печатать плату или печатать сообщение типа «попробуй еще раз».

  • Выполнение функции члена advance вызывает исключение, если перемещение недействительно. Вызывающий код должен поймать исключение.

Существует множество других способов решения этих проблем.

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