попробуйте бросить обработку исключений - PullRequest
0 голосов
/ 23 сентября 2011

У меня небольшие проблемы с работой следующего фрагмента кода. Я не могу написать исключение броска, поэтому я не знаю, что еще я мог сделать.

case 't':  // Top of Stack
             try
             {
               cout << "Top() -- " << sPtr->Top() << endl; //this should run if the stack is not empty.
             }
             catch (StackEmpty)
             {
               cout << "Top() -- Failed Empty Stack" << endl; // this should run if the stack is empty.
             }
             break;

sPtr указывает на функцию Top () в имени класса. Вот стек, код этой функции:

int Stack::Top() const  // Returns value of top integer on stack WITHOUT modifying the stack
{   cout << "*Top Start" << endl;
if(!IsEmpty())
return topPtr->data;
cout << "*Top End" << endl;
}

если я удаляю оператор if, это вызывает проблему с ошибкой сегментации.

Ответы [ 2 ]

3 голосов
/ 23 сентября 2011

На самом деле вы ничего не выбрасываете при сбое, а в случае, когда стек пуст, вы просто запускаете конец функции, ничего не возвращая. Кроме того, ваш последний оператор журнала ударил только тогда, когда стек пуст.

Вам нужно что-то похожее на это:

int Stack::Top() const  // Returns value of top integer on stack WITHOUT modifying the stack
{ 
  cout << "*Top Start" << endl;
  if(!IsEmpty())
  {
     cout << "*Top End" << endl;
     return topPtr->data;
  }
  cout << "*Top End" << endl;
  throw StackEmpty();
}
3 голосов
/ 23 сентября 2011

Почему «вы не можете» выбросить исключение?Обратите внимание, что если вы ничего не возвращаете из Top() (когда ваш стек пуст), вы просите о возникновении проблемы.Top() должно быть предварительным условием, чтобы стек не был пустым, поэтому, если вы не можете выбросить исключение, утверждение будет приемлемым, даже предпочтительным, по крайней мере, для меня.

Кстати, исключения являютсябросили так:

throw StackEmpty();
...