Template-uri de fun c£ii. Tratarea excep£iilor

download Template-uri de fun c£ii. Tratarea excep£iilor

of 40

  • date post

    13-Jan-2016
  • Category

    Documents

  • view

    32
  • download

    4

Embed Size (px)

description

Template-uri de fun cţii. Tratarea excepţiilor. Programarea calculatoarelor şi limbaje de programare I C apitolul 12. Introducere. Template-urile (şabloanele) reprezintă una dintre cele mai puternice caracteristici ale limbajului C++ P ermit definirea, printr-un singur segment de cod - PowerPoint PPT Presentation

Transcript of Template-uri de fun c£ii. Tratarea excep£iilor

  • Template-uri de funcii. Tratarea excepiilorProgramarea calculatoarelor i limbaje de programare I

    Capitolul 12

    Programarea calculatoarelor i limbaje de programare I

  • IntroducereTemplate-urile (abloanele) reprezint una dintre cele mai puternice caracteristici ale limbajului C++Permit definirea, printr-un singur segment de coda unei ntregi game de funcii suprancrcate template de funciea unei ntregi serii de clase template de clasTratarea excepiilor este o metod care permite programatorilor s scrie programe mai robuste, mai clare i cu un grad mai mare toleran la eroriProgramele pot fi concepute astfel nct s detecteze i s trateze erorile (excepiile) care pot aprea n timpul rulrii, evitnd astfel ntreruperile neplanificate ale aplicaiilor

    Programarea calculatoarelor i limbaje de programare I

  • SumarTemplate-uri de funciiTratarea excepiilor

    Programarea calculatoarelor i limbaje de programare I

  • Template-uri de funciiFunciile suprancrcate realizeaz operaii similare pentru diferite tipuri de dateDac operaiile sunt identice pentru toate tipurile de date, acestea pot fi realizate mai compact folosind template-uri de funciiProgramatorul trebuie s scrie doar o singur definiie de template de funcieBazndu-se pe tipurile argumentelor date explicit sau rezultate din apeluri ale acestor funcii, compilatorul genereaz funcii separate n codul obiect pentru a manipula corespunztor fiecare tip de apel

    Programarea calculatoarelor i limbaje de programare I

  • Template-uri de funciin limbajul C, acest lucru poate fi realizat folosind macrouri create prin directiva de preprocesare #defineEste o metod care poate produce efecte nedorite i care nu permite compilatorului s fac verificri de tip

    Programarea calculatoarelor i limbaje de programare I

  • Template-uri de funciiToate definiiile de template-uri de funcii ncep prin cuvntul cheie template urmat de lista parametrilor formali de tip ai template-ului de funcie plasat ntre < >Fiecare parametru formal de tip trebuie s fie precedat de cuvntul cheie class sau de typename Exempletemplate< class T >template< typename ElementType >template< class BorderType, class FillType >

    Programarea calculatoarelor i limbaje de programare I

  • Template-uri de funciiParametrii formali de tip din definiia unui template de funcie sunt utilizai pentru a specifica tipurile argumentelor funcieitipul valorii returnate de funcie pentru a declara variabile n funcieDefiniia funciei este cea a unei funcii obinuiteCuvintele cheie class sau typename folosite pentru a specifica parametrii de tip ai template-ului au semnificaia de orice tip de dat predefinit sau definit prin program

    Programarea calculatoarelor i limbaje de programare I

  • Template-uri de funciiProgramul urmtor definete funcia PrintArray care tiprete componentele unor tablouri

    template< class T >void PrintArray(const T *array, const int count){ for(int i = 0; i < count; i++) cout

  • Template-uri de funciiint main(){ const int aCount = 5, bCount = 7, cCount = 6; int a[aCount] = {1, 2, 3, 4, 5}; double b[bCount] = {1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7}; char c[cCount] = "HELLO"; cout
  • Template-uri de funciiAcest program afieaz:

    Tabloul a contine: 1 2 3 4 5 Tabloul b contine: 1.1 2.2 3.3 4.4 5.5 6.6 7.7 Tabloul c contine: H E L L O

    Programarea calculatoarelor i limbaje de programare I

  • Template-uri de funciiFuncia template PrintArray declar un singur parametru formal de tip cu numele TIdentificatorul T poate fi nlocuit cu orice alt identificator validPrin T se definete generic tipul tabloului ale crui componente urmeaz s fie tipriteAtunci cnd compilatorul detecteaz n program un apel al funciei PrintArray, tipul argumentului generic este nlocuit cu tipul parametrului actual i se creeaz o funcie pentru tiprirea tabloului cu acest tipNoua funcie este apoi compilat

    Programarea calculatoarelor i limbaje de programare I

  • Template-uri de funciin exemplul de mai sus, sunt instaniate trei funcii PrintArray, cu argumente de tip int, double i char Instanierea pentru tipul de dat int estevoid PrintArray(const int *array, const int count){ for(int i = 0; i < count; i++) cout
  • Template-uri de funciiNumele unui parametru formal de tip poate fi folosit o singur dat n lista de parametri ai header-ului unui template n programul de mai sus, funcia PrintArray este apelat de trei ori cu argumentele a de tip int*, b de tip double* i c de tip char* pentru primul parametru

    Programarea calculatoarelor i limbaje de programare I

  • Template-uri de funciiApelul PrintArray(a, aCount);face ca apariiile lui T n funcia PrintArray s fie transformate n int i compilatorul instaniaz funcia PrintArray pentru T de tip int n mod asemntor se ntmpl i pentru apelurile PrintArray(b, bCount);PrintArray(c, cCount);

    Programarea calculatoarelor i limbaje de programare I

  • Template-uri de funciin acest program, mecanismul template-urilor face ca programatorul s nu mai fie nevoit s scrie trei funcii suprancrcate cu prototipurile

    void PrintArray(const int *, const int);void PrintArray(const double *, const int);void PrintArray(const char *, const int);

    Programarea calculatoarelor i limbaje de programare I

  • SumarTemplate-uri de funciiTratarea excepiilor

    Programarea calculatoarelor i limbaje de programare I

  • Tratarea excepiilorExist mai multe tehnici prin care pot fi tratate erorile care apar n timpul rulrii unui programCea mai folosit este aceea de a introduce n program secvene de cod adaptate prevenirii unor posibile situaii nedoriteErorile sunt tratate n locul n care apar n program

    Programarea calculatoarelor i limbaje de programare I

  • Tratarea excepiilorAvantajul acestei abordri este c persoana care citete codul poate vedea modalitatea de prelucrare a erorii n vecintatea codului poate determina dac metoda de tratare a excepiei este implementat corectDezavantajul este c prin aceast schem codul este oarecum poluat cu secvene de procesare a erorilor devine mult mai greu de citit de un programator care este concentrat pe aplicaia nsiAceast metod face codul mult mai greu de neles i de meninut

    Programarea calculatoarelor i limbaje de programare I

  • Tratarea excepiilorTratarea excepiilor n C++ permite programatorilor s nlture partea de tratare a excepiilor din secvena principal de programStilul C++ de tratare a excepiilor permite interceptarea tuturor excepiilor sau a tuturor excepiilor de un anumit tipAceasta face programul mult mai robust, reducnd probabilitatea de ntrerupere neplanificat a programuluiTratarea excepiilor se folosete n situaia n care programul poate s i continue rularea dup ce depete eroarea care provoac excepia

    Programarea calculatoarelor i limbaje de programare I

  • Tratarea excepiilor try, throw i catch Tratarea excepiilor n C++ este o metod care se aplic atunci cnd funcia care detecteaz o eroare nu o i trateazEa doar genereaz sau arunc excepia (throw)Nu se garanteaz c excepia va fi i tratat n afara funcieiPentru aceasta, trebuie specificat o secven de cod care detecteaz sau prinde excepia i o trateaz

    Programarea calculatoarelor i limbaje de programare I

  • Tratarea excepiilor try, throw i catchProgramatorul trebuie s includ ntr-un bloc try codul care ar putea genera o eroare generatoare a unei excepiiBlocul try este urmat de unul sau mai multe blocuri catchFiecare bloc catch specific tipul excepiei pe care o poate detecta i trataDac excepia se potrivete cu tipul parametrului unuia dintre blocurile catch, se execut codul acelui catch

    Programarea calculatoarelor i limbaje de programare I

  • Tratarea excepiilor try, throw i catchDac nu este identificat niciun bloc catch care s trateze eroarea, se apeleaz funcia predefinit terminate care la rndul ei apeleaz n mod implicit funcia predefinit abort pentru ntreruperea programului Dac ntr-un bloc try nu se genereaz nicio excepie, programul ruleaz ignornd blocurile catch asociate lui

    Programarea calculatoarelor i limbaje de programare I

  • Tratarea excepiilor try, throw i catch#include #include using std::cin;using std::cout;using std::endl;using std::runtime_error;

    double Fractie(int numarator, int numitor){ if(numitor == 0) throw runtime_error("Numitorul este 0"); return static_cast(numarator)/numitor;}

    Programarea calculatoarelor i limbaje de programare I

  • Tratarea excepiilor try, throw i catchint main(){ int numar1, numar2; double rezultat; cout > numar1 >> numar2) { try { rezultat = Fractie(numar1, numar2); cout
  • Tratarea excepiilor try, throw i catchUn exemplu de rulare a acestui program este urmtorul:

    Introduceti doi intregi (EOF pentru a termina): 3 4Valoarea fractiei este: 0.75Introduceti doi intregi (EOF pentru a termina): 5 0A aparut urmatoarea exceptie: Numitorul este 0Introduceti doi intregi (EOF pentru a termina):CTRL-D

    Programarea calculatoarelor i limbaje de programare I

  • Tratarea excepiilor try, throw i catchProgramul calculeaz rezultatul mpririi a dou numere ntregiDac numitorul este 0, este declanat o excepie i se semnaleaz eroareaProgramul conine un bloc try care cuprinde codul care ar putea genera o excepieOperaia de mprire a celor dou numere este implementat prin funcia Fractie care genereaz o excepie prin instruciunea throw atunci cnd numitorul este 0

    Programarea calculatoarelor i limbaje de programare I

  • Tratarea excepiilor try, throw i catchClasa runtime_error face parte din biblioteca standard i este declarat n fiierul header stdexceptEste derivat din clasa de baz exception care face parte tot din biblioteca standard, fiind declarat n fiie