Olyan hibakat oldhatunk meg vele, amit helyben nem lehet megszuntetni.
Egyik nagy elonye , hogy a hagyomanyos kodot es a hibakezelo kodot szetvalassza.
A C++ nylevben a kiveltelesemenyt jelenzni lehet egy primitiv tipusu valtozo segitsegevel.
class Error{...};
void f(){
if(feltetel){
throw Error()
}
}
// kivetel lekezelese
try{
f();
}catch(Error){
// kiveltelkezelo blokk
}
Pelda: stack.h#ifndef stack_h
#define stack_h
using namespace std;
class Staxk{
public:
class Stack_Overflow{};
class Stack_Underflow{};
virtual void push(char)=0;
virtual char pop()=0;
};
class Array_Stack : public Stack{
private:
char *s;
int top;
int max_size;
public:
Array_Stack(int max_size);
Array_Stack(const Array_Stack&);
~Array_Stack();
void push(char c) throw (Stack_Overflow);
char pop() throw (Stack_Underflow);
};
$endif
A fenti Stack osztaly egy absztrakt osztaly amely csak tipusdefiniciokat es fugvenydeklaraciokat tartalmaz, tehat tamogatja az absztrak adatipusokat, mivel nem ad meg semmi informaciot az adatok abrazolasara, illetve a muveletek implementaciojara vonatkozoan.
Az ilyen absztrakot osztalyokat feluleteknek is nevezzuk, mert feluletet biztositnak mas osztalyok szamara.
Erre epitjuk fel az Array_Stack konkrek osztalyt, amely az absztrakt osztaly konkret leszarmazotja lesz.
Az osztalyunknak ket konstruktora van az elso parameter nelkuli, a masodik a masolo konstruktor.
A C++ nincs automatikus szemetgyujtes ezert szuksegunk van a destruktorra, amely az objektum dinamikus helyfoglalasat semmisiti meg.
Pelad: stack.cpp
#include "stack.h" #includeusing namespace std; Array_Stack :: Array_Stack(int _max_size){ max_size = _max_size; s = new char[_max_size]; top = 0; } // masolo konstruktor Array_Stack :: Array_Stack(Array_Stack & _as){ this->max_size = _as.max_size; this->s = new char[max_size]; this->top = _as.top; } // destruktor Array_Stack :: ~Array_Stack(){ //cout<<"\nDestructor: "<< this->max_size<<"\n"; delete [] s; } void Array_Stack :: push(char c) throw (Stack_Overflow){ if(top >= max_size) throw Stack_Overflow(); s [top++] = c; } char Array_Stack :: pop() throw (Stack_Underflow){ if(top == 0) throw Stack_Underflow(); return s[--top]; }
A fenti kod a Stack_Array osztaly metodusait implementalja.
Pelda: test_stack.cpp
#include#include "stack.h" #include using namespace std; int main(){ Array_Stack as(100); try{ printf("\n%c", as.pop()); }catch(Stack :: Stack_Underflow x){ //cout<<"Stack_Underflow"<<"\n"; } return 0; }
No comments:
Post a Comment