Upload
hathien
View
219
Download
0
Embed Size (px)
Citation preview
- p. 1/24
Zaawansowane programowanie w C++ (PCP)
Wykład 5 - obsługa błedów.Mechanizm wyjatków.
dr inz. Robert Nowak
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
- p. 2/24
Powtórzenie - wzorce projektowe
� wzorce kreacyjne� fabryka abstrakcyjna (abstract factory)� prototyp (prototype)� singleton (singleton)
� wzorce strukturalne� adapter (wrapper)� fasada (fasade)� most (bridge)� proxy (proxy)� kompozyt (composite)
� wzorce czynnosciowe� iterator (iterator)� polecenie (command)� odwiedzajacy (visitor)� obserwator (observer)� interpreter (interpreter)� strategia (strategy)� stan (state)
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
- p. 3/24
Wzorzec wizytatora
� ustalona hierarchia klas� wiele metod, metody moga sie zmieniac
Element
+ accept(Visitor)
Wizytator
+ wizytuj(ElementA*)
+ wizytuj(ElementB*)
+ wizytuj(ElementC*)
KonkretnyWizytator1
+ wizytuj(ElementA*)
+ wizytuj(ElementB*)
+ wizytuj(ElementC*)
KonkretnyWizytator2
+ wizytuj(ElementA*)
+ wizytuj(ElementB*)
+ wizytuj(ElementC*)
ElementA
+ accept(Visitor)
ElementB
+ accept(Visitor)
ElementC
+ accept(Visitor)
Hierarchia klas
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
- p. 4/24
Wizytator (2)
class Visitor; //Deklaracja
class Element { //Klasa bazowa
virtual void accept(Visitor& v) = 0;
};
/ * Deklaracje konkretnych elementów * /
class Visitor { //Abstrakcyjny wizytator
public:
virtual void visit(ElementA&) = 0;
virtual void visit(ElementB&) = 0;
virtual void visit(ElementC&) = 0;
};
class ElementA : public Element {
public:
virtual void accept(Visitator& v) {
v.visit( * this); //Woła metode visit(ElementA&)
}
//Dalsza cze s c implementacji klasy ElementA
};
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
» Mechanizmy obsługi błedów
» kod powrotu
» zmienna globalna
» błedny stan obiektu
Wyjatki
- p. 5/24
Mechanizmy obsługi błedów
� autor klasy (biblioteki) moze wykryc bład, lecz nie wie, co znim zrobic
� uzytkownik klasy (biblioteki) wie co zrobic z błedem, lecz niepotrafi go wykryc
Mechanizmy:� Nieprawidłowe:
� ignorowanie błedów� konczenie działania programu� komunikaty dla uzytkownika.
� Kłopotliwe:� kod powrotu� zmienna globalna: ostatni bład� specjalny błedny stan obiektu.
� Mechanizm wyjatków.
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
» Mechanizmy obsługi błedów
» kod powrotu
» zmienna globalna
» błedny stan obiektu
Wyjatki
- p. 6/24
kod powrotu
Metoda zwraca wartosc, która jest interpretowana jakopowodzenie (lub niepowodzenie) pewnej operacji.
class Wektor {
//...
bool add(int i); //Zwraca false gdy niepowodzenie
};
//Przykład u zycia
Foo foo;
if(!foo.add(4)) //Sprawdzanie, czy nie wystapił bład
//Tutaj kod obsługi błedu
Mechanizm niewygodny poniewaz:� rezerwacja zwracanej wartosci na kod błedu� kazda funkcja musi byc badana, czy nie sygnalizuje
wystapienia błedu� programista moze zignorowac fakt wystapienia błedu� kod obsługi błedów wymieszany z innym kodem
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
» Mechanizmy obsługi błedów
» kod powrotu
» zmienna globalna
» błedny stan obiektu
Wyjatki
- p. 7/24
zmienna globalna
Funkcja, która sygnalizuje wystapienie błedu ustawiaodpowiednia wartosc zmiennej globalnej. Mechanizm typowydla ’C’ (#include <errno.h> )
extern int errno; //Zmienna globalna, przechowuje kody błedów
class Plik {
//...
zapisz(const char * buf); //Ustawia errno gdy wystapi bład
};
Plik p; //Przykład u zycia
p.zapisz(buforA);
if(errno == ENOFILE) //Sprawdzanie, czy wystapił okre slony bład
//Obsługa błedu
� obiekt globalny - potencjalne zródło kłopotów� nalezy co jakis czas sprawdzac wartosc� programista moze zignorowac fakt wystapienia błedu� kod obsługi błedów wymieszany z innym kodem
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
» Mechanizmy obsługi błedów
» kod powrotu
» zmienna globalna
» błedny stan obiektu
Wyjatki
- p. 8/24
błedny stan obiektu
Przykład:
class Macierz {
public:
//Tworzy macierz o podanych rozmiarach
explicit Macierz(int sizeX=2, int sizeY=2);
Macierz operator+(const Macierz& m) const {
if(m.sizeX() != sizeX() || m.sizeY() != sizeY() )
return Macierz(-1,-1); //błedna macierz
//...
Wady:� nie zawsze jest mozliwe wprowadzenie wartosci błednej� programista moze zignorowac fakt wystapienia błedu
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 9/24
Mechanizm wyjatków
class Wektor {
int * tab;
int rozm;
public:
class Zakres{ }; //Klasa wyjatku
int& operator[](int index);
};
int& Wektor::operator[](int i) {
if(i >= 0 && i < rozm) return tab[i];
else throw Zakres(); //Funkcja biblioteczna rzuca wyjatek
}
void f(Wektor& w) {
try { //Funkcja u zytkownika bedzie przechwytywa c wyjatki
g(w);
}
catch(Wektor::Zakres) { //Procedura obsługi wyjatku
//kod obsługi błedu
}
}
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 10/24
Wyjatki w konstruktorachrozróznianie wyjatków
class Wektor {
static const int MAX = 32000;
//Składowe takie jak poprzednio
public:
class Rozmiar { }; //klasa wyjatku złego rozmiaru
Wektor(int r);
};
Wektor::Wektor(int r) {
if(r < 0 || r >= MAX) throw Rozmiar(); //Zgłaszanie błedu w
//utworzenie obiektu
}
void f() {
try {
//u zywaj wektorów
}
catch(Wektor::Zakres) { / * obsługa błedu zakresu * / }
catch(Wektor::Rozmiar) { / * obsługa błedu rozmiaru * / }
}
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 11/24
Składnia
� blok-try:try instrukcja-złozona lista-proc-obsługi
� lista-proc-obsługi:proc-obsługi [lista-proc-obsługi]
� proc-obsługi:catch ( deklaracja-wyjatku ) instrukcja-złozona
� deklaracja-wyjatku:lista-specyfikatorów-typu deklaratorlista-specyfikatorów-typu. . .
� wyrazenie-zgłoszenia:throw [wyrazenie]
� specyfikacja-wyjatków:throw [ ( lista-typów ) ]
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 12/24
Klasy, które reprezentuja błedy
Nie uzywaj typów standardowych dosygnalizowania błedów
� Powinny dziedziczyc po std::exception , posiadaja funkcjewirtualne
� Tworzone podczas zgłaszania wyjatku w specjalnym miejscu� Konstruktor nie moze zgłaszac wyjatków!� Dostarcza konstruktora kopiujacego� rzucanie przez wartosc, przechwytywane przez referencje
//Przykładowa klasa błedu przy konwersji napisu na liczb˛ e
class InputException : public std::exception {
char bad_char;
public:
InputException(char c) : bad_char(c) {}
InputException(const InputException& e) throw()
: bad_char(e.bad_char){}
char getBadChar() const return bad_char;
};
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 13/24
Grupowanie wyjatków
class ExceptionMat : public std::exception {
};
class ExceptionDzielZero : public ExceptionMat {
//Składowe i metody specyficzne dla tego błedu
};
class ExceptionNadmiar : public ExceptionMat {
//Składowe i metody specyficzne dla tego błedu
};
Procedura obsługi dla wyjatku wywołuje sie gdy:� typ uzyty do wyłapywania wyjatku jest identyczny jak typ
rzuconego wyjatku� typ uzyty do wyłapywania jest klasa podstawowa
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 14/24
Rzucanie wyjatku
� przez wartosc (obiekt jest tworzony w specjalnym miejscu)� przez wskaznik - problemy z zarzadzaniem pamiecia
int my_atoi(const string& str) {
for(int i=0;i<str.size();++i) {
char curr = str[i];
if(!isdigit(curr) )
throw InputException(curr);
/ * implementacja * / ;
};
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 15/24
Obsługa wyjatku
Wyjatki nalezy łapac przez referencje (unika sie kopiowania)
Istotna jest kolejnosc sekcji catch
try { / * Kod, który mo ze wyrzuci c wyjatek * / }
catch(const std::ios_base::failure&) { / * bład strumienia * / }
catch(const std::exception&) { / * dowolny wyjatek std * / }
Odrzucenie wyjatku
try {
//Kod, który mo ze zgłosi c wyjatek
}
catch(const ExceptionMat&) {
//Zrób, co sie da
throw; //zgło s ponownie wyjatek
}
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 16/24
Standardowe klasy wyjatków
bad_alloc bad_cast bad_typeid
exception
out_of_range
bad_exception
logic_error runtime_error
invalid_argument overflow_error
ios_base::failure
Nazwa zgłaszajacy
bad_alloc new
bad_cast dynamic_cast
bad_typeid typeid
bad_exception throw
Wyjatki biblioteki standardowej (std)Nazwa kto zgłasza
out_of_range at()
invalid_argument bitset
overflow_error bitset
ios_base::failure clear()
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 17/24
mechanizmów wyjatków a zasoby
� inny mechanizm powrotu� korzysta ze zwijania stosu
void f1() {
int * tmp = new int;
//Kod, który u zywa tmp i mo ze rzuci c wyjatkiem
delete tmp;
}
//Nieudolna poprawa
void f2() {
int * tmp = new int;
try {
//Kod, który u zywa tmp i mo ze rzuci c wyjatkiem
}
catch(...) { //Przechwytuje wszystkie wyjatki
delete tmp; throw;
}
delete tmp;
}
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 18/24
Zdobywanie zasobów jest inicjowaniem
class WskaznikDoInt {
int * ptr;
public:
WskaznikDoInt(int * p) : ptr(p) { }
˜WskaznikDoInt() { delete ptr; }
operator int * () { return ptr; }
int * get() { return ptr; }
}
void f3() {
WskaznikDoInt pi(new int);
( * tmp) = 4; //przykładowy kod wykorzystujacy obiekt pi
//Kod, który u zywa wskaznika mo ze rzuci c wyjatkiem
} //destruktor obiektu lokalnego pi wywoła operator delete
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 19/24
Zdobywanie zasobów jest inicjowaniem
class WskaznikDoPliku {
FILE * p;
public:
WskaznikDoPliku(const char * nazwa, const char * atr) {
p = fopen(nazwa, atr);
}
˜WskaznikDoPliku() { fclose(p); }
operator FILE * () { return p; }
}
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 20/24
Wyjatki niewyłapane
Funkcja terminate()� domyslna implementacja: exit(1)
� zmiana zachowania domyslnego:
typedef void( * PFV)();
PFV set_terminate(PFV);
� przykład:
void bladKrytyczny(){
ErrorLog::getInstance().errorMsg(¨nie wyłapany wyjat ek¨);
exit(1);
}
int main() {
set_terminate(&bladKrytyczny);
catch(...) - przechwytuje wszystkie wyjatki.
Wyjatki w destruktorach
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 21/24
Specyfikacja interfejsu
� Mozna okreslic jakie wyjatki zgłasza ze funkcja (metoda)void f() throw (ExceptionMat);
� funkcja (metoda) która nie zgłasza wyjatków:void f() throw ();
� jezeli nie ma sekcji throw w deklaracji funkcji przyjmuje sie,ze moze ona zgłaszac dowolny wyjatek
� wyjatek bad_exception
� metoda unexpected() - domyslnie woła terminate()
� zmiana zachowania domyslnego
typedef void( * PFV)();
PFV set_unexpected(PFV);
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 22/24
Podsumowanie
Rodzaje klas:� klasy autonomiczne� klasy bazowe dla hierarchii klas� klasy wyjatków
� biblioteka nie powinna przerywac działanie programu� biblioteka nie powinna drukowac komunikatu o błedzie� nie kazda funkcja musi obsługiwac kazdy mozliwy bład� funkcja main powinna obsługiwac wszystkie wyjatki� stosuj zasade „zdobywanie zasobów jest inicjowaniem”
uzywaj wyjatków do obsługi błedów!
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 23/24
boost::scoped_ptr
� Odpowiada dokładnie strategii „zdobywanie zasobów jestinicjowaniem”
� Destruktor usuwa wskaznik� Zabronione kopiowanie
template<typename T> class scoped_ptr : noncopyable {
public:
explicit scoped_ptr(T * p = 0);
˜scoped_ptr(); //Usuwa obiekt wskazywany
void reset(T * p = 0); //Zmienia wskaznik
T& operator * () const;
T* operator->() const;
T* get() const;
};
void f() {
scoped_ptr<MojaKlasa> klasa(new MojaKlasa);
//kod, który mo ze wyrzuca c wyjatki
} //Destruktor klasy auto_ptr wywoła operator delete
» Powtórzenie - wzorce
projektowe
» Wzorzec wizytatora
» Wizytator (2)
Mechanizmy obsługi błedów
Wyjatki
» Mechanizm wyjatków
» Wyjatki w konstruktorach
rozróznianie wyjatków
» Składnia» Klasy, które reprezentuja
błedy
» Grupowanie wyjatków
» Rzucanie wyjatku
» Obsługa wyjatku
» Standardowe klasy wyjatków
» mechanizmów wyjatków a
zasoby
» Zdobywanie zasobów jest
inicjowaniem
» Zdobywanie zasobów jest
inicjowaniem
» Wyjatki niewyłapane
» Specyfikacja interfejsu
» Podsumowanie
» boost::scoped_ptr
» „Wzorzec pimpl”
- p. 24/24
„Wzorzec pimpl”
Ukrywanie implementacji:
class Foo {
public:
//Interfejs klasy
private:
struct Impl; //Deklaracja poprzedzajaca
scoped_ptr<Impl> pImpl_; //Sprytny wskaznik
};