обработка исключений — выбрасывает ключевое слово в переполнении стека

Может кто-нибудь указать правильный способ сделать эту программу с обработкой исключений? Это программа для стеков.

1)#include<iostream>
2)#include<stdlib.h>
3)#include<string.h>
4)using namespace std;
5)
6)template<class T>
7)class Stack {
8)private:
9)  int max;
10) int top;
12) T* items;
13)public:
14) Stack(int size) {
15)     max = size;
16)     top = -1;
17)     items = new T[max];
18) }
19) ~Stack(){delete [] items;}
20)
21) void push(T data) throws Exception{
22)     if(full()) {
23)         throw new StackException("Out of space!");
24)     }
25)     items[++top] = data;
26) }
27) T pop(){
28)     if(empty()) throws Exception {
29)         throw new StackException("No more elements to delete");
30)     }
31)     return items[top--];
32) }
33)
34) bool full() { return top == max-1; }
35) bool empty() { return top == -1; }
36)};
37)
38)int main() {
39)    try{
40)     Stack<int> s(10);
41)     s.push(1);
42)     s.push(2);
43)     cout<<s.pop()<<endl;
44)    }
45)    catch(StackException e){
46)     cout<<e.what()<<endl;
47)    }
48)    return 0;
49)}

Изменить: я получаю следующие ошибки. Я новичок в обработке исключений в C ++, хотел знать, правильно ли я делаю —

     3stacks.cpp:20:18: error: expected ‘;’ at end of member declaration
3stacks.cpp:20:20: error: ‘throws’ does not name a type
3stacks.cpp:26:8: error: expected ‘;’ at end of member declaration
3stacks.cpp:26:10: error: ‘throws’ does not name a type
3stacks.cpp: In function ‘int main()’:
3stacks.cpp:44:8: error: expected type-specifier before ‘StackException’
3stacks.cpp:44:23: error: expected ‘)’ before ‘e’
3stacks.cpp:44:23: error: expected ‘{’ before ‘e’
3stacks.cpp:44:23: error: ‘e’ was not declared in this scope
3stacks.cpp:44:24: error: expected ‘;’ before ‘)’ token

-5

Решение

Вы не определили StackException где-нибудь в вашей программе. Вы должны создать это самостоятельно. Также раздеться throws Exception из вашей сигнатуры функции, так как вы никогда не определяли этот тип либо (и он называется throw Exception).

Более того, нет необходимости указывать, какие исключения возможны в сигнатуре, но лучше указать, что функция никогда не сгенерирует (используя noexcept в C ++ 11). Укажите возможные исключения в документации. Кроме того, вы пропустили возможное bad_alloc,

В общем, удалите весь свой код и используйте std::stack от <stack> и лишить эти библиотеки C. Однако вот пример, как вы могли бы сделать это:

template<class T>
class Stack {
private:
int max;
int top;
T * items;
public:
struct out_of_space{};
struct empty_stack{};
Stack(int size) {
if(size)
max = size;
top = -1;
items = new T[max];
}
~Stack(){delete[] items;}

void push(const T & data){
if(full()) {
throw out_of_space();
}
items[++top] = data;
}
T pop(){
if(empty()){
throw empty_stack();
}
return items[top--];
}

bool full() const { return top == max-1; }
bool empty() const { return top == -1; }
};

int main() {
try{
Stack<int> s(10);
s.push(1);
s.push(2);
cout<<s.pop()<<endl;
} catch(const Stack<int>::out_of_space& e){
cout<< "stack out of space" <<endl;
} catch(const Stack<int>::empty_stack & e){
cout<< "stack is empty" <<endl;
}
return 0;
}

На самом деле использовать e.what() Вы должны были бы реализовать это самостоятельно. Или вы могли бы унаследовать std::exceptionперегрузи и просто лови const std::exception&,

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]