Presentation is loading. Please wait.

Presentation is loading. Please wait.

Exceptions, konstruktor,destruktor, etc. sid. 1 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Enkel felhantering - assert() #include using namespace.

Similar presentations


Presentation on theme: "Exceptions, konstruktor,destruktor, etc. sid. 1 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Enkel felhantering - assert() #include using namespace."— Presentation transcript:

1 Exceptions, konstruktor,destruktor, etc. sid. 1 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Enkel felhantering - assert() #include using namespace std; // Kan ev. behövas inline void checkRange(int index) { assert (index >= 0 && index < size); } Ett C-makro - ouppfyllt villkor skrivs ut+abort

2 Exceptions, konstruktor,destruktor, etc. sid. 2 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Avancerad felhantering - Exceptions Viktig del av klassbiblioteksdesign “Hoppa direkt ut med felkod” class divisionMedNoll {/*...*/};... if (delaMed == 0) throw divisionMedNoll(); resultatet = taljarUttr / delaMed ;... explicit konstruktoranrop! Exceptions brukar vara klasser

3 Exceptions, konstruktor,destruktor, etc. sid. 3 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Exceptions forts jämför C: #define divide_by_zero 7... if (divi == 0) return divide_by_zero ; /* else continue here */ En exception orsakar uthopp genom alla anropande funktioner tills den fångas. Om den inte fångas i programmet anropas terminate() och programmet avslutas.

4 Exceptions, konstruktor,destruktor, etc. sid. 4 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Hur man hanterar exceptions try { kompliceradDivision(x,y,z,p,k,result); } catch (divisionMedNoll) { cout << “Division med noll!”; result = 1; }

5 Exceptions, konstruktor,destruktor, etc. sid. 5 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Första catch matchar try { // kod.... } catch (divisionMedNoll) { /*...*/} catch (std::bad_alloc) {/*...*/} catch (...) { cout << “det blev nåt fel”; } Fånga specialiserade fel först och vanligaste feltyp sist för att kunna hantera på bästa sätt. (exceptions ingår ofta i arvshierarki)... tar alla exceptions

6 Exceptions, konstruktor,destruktor, etc. sid. 6 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Exception specification - i snitt mot användaren void kompliceradDivision(int x, int y, int z, int p, int k, int result) throw(divisionMedNoll, forStortTal); // Garanteras att funktionen ej ger andra // exceptions extern void noProblem(int x) throw(); // noProblem garanterar: inga exceptions alls annars: unexpected() terminate()

7 Exceptions, konstruktor,destruktor, etc. sid. 7 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Exception-hantering i flera steg float meanVal() { try { /* kod */ } catch (divisionMedNoll) { cout << “Division med noll i meanVal()”; throw; // divisionMedNoll “kastas” // vidare för hantering i anropande rutin }

8 Exceptions, konstruktor,destruktor, etc. sid. 8 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Vad händer med stack,heap? stack unwind - anropsstacken plockas ner för objekt i stacken görs destruktoranrop minnesläckagerisk - om man använt “new” måste man avallokera

9 Exceptions, konstruktor,destruktor, etc. sid. 9 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Konstruktor Ser till att objektets data är korrekt initierade MinKlass::MinKlass(); MinKlass::MinKlass(int length; char *name); ser ut som funktion utan returvärde Konstruktorns namn = klassens namn xy034pk a[ -32877 length: name:

10 Exceptions, konstruktor,destruktor, etc. sid. 10 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Defaultkonstruktor används om inga parametrar ges har inga parametrar MinKlass::MinKlass(); eller har defaultvärden till alla parametrar MinKlass::MinKlass(int length = 5); Sen brukar det förstås finnas en eller flera andra konstruktorer med vardera en eller flera parametrar, beroende på vad som är naturligt för objekttypen

11 Exceptions, konstruktor,destruktor, etc. sid. 11 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Vad gör konstruktorn? Initierar medlemsdata till 0, false, tom sträng, etc... eller inparametrarnas värden. Sätter tillståndsmaskin-objekt i startläge. Flaggar explicit “detta är ett oinitierat objekt”, “listan är tom”, etc. Genererar en unik identitet till objekt som ska ha det. eller nåt annat som är vettigt för objekttypen.

12 Exceptions, konstruktor,destruktor, etc. sid. 12 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT När exekveras konstruktorn? Då ett objekt deklareras: MinKlass mittObj; // Obs ingen parentes! /* jfr int myInt; samma form, analogt */ // Om konstruktorn är inline hamnar dess kod här. Då man skapar ett objekt med new: MinKlass *minObjP = new MinKlass(); // Konstruktorn exekveras inte om minnesallokeringen // misslyckas.

13 Exceptions, konstruktor,destruktor, etc. sid. 13 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Om det inte finns någon defaultkonstruktor MinKlass mittObj; mittObj:s datamedlemmar får typberoende “nollvärden” eller lämnas oinitierade. Kan vara OK...men Deklarara (default)konstruktor MinKlass() {/* kod *} så har Du koll på vad som händer!

14 Exceptions, konstruktor,destruktor, etc. sid. 14 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Finns det inget vettigt defaultvärde? Tvinga användaren att ange parametervärden genom att Bara deklarera konstruktorer med parametrar

15 Exceptions, konstruktor,destruktor, etc. sid. 15 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT initieringslista (member initialization list) MinKlass::MinKlass(int length; char *name) : _name(name), _length(length){/*kod*/} konstruktoranrop olle 3 _length: _name: class MinKlass {... int _length; string _name; } initierings- ordning!

16 Exceptions, konstruktor,destruktor, etc. sid. 16 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Destruktor Städar upp! Frigör dynamiskt allokerat minne “ägt” av objektet Frigör andra resurser objektet använt –bilnummer –bankkontonummer –semafor ~Johnson() {/**/} oemottaglig för argument uträttar inget ger inget tillbaka är dessutom destruktiv!

17 Exceptions, konstruktor,destruktor, etc. sid. 17 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Copy-konstruktor Bildata minSaab900(xxxxxx); Bildata dinNyaSaab900 (minSaab900); // “Default memberwise initialization” // Alla datamedlemmars innehåll kopieras // Helt tillåtet... men bilnumret? Bildata::Bildata(const Bildata & b) {/*kod*/} Måste inte vara const men brukar vara det

18 Exceptions, konstruktor,destruktor, etc. sid. 18 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Objekt som inte får kopieras? Förbjud kopiering genom att Deklarera men ej implementera defaultkonstruktorn MinKlass(const MinKlass &m); // inte med i minklass.cpp Deklarera defaultkonstruktorn som privat private: MinKlass (const MinKlass &m) {}

19 Exceptions, konstruktor,destruktor, etc. sid. 19 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Copy assignment operator Bildata minSaab900(xxxxxx); Bildata dinNyaSaab900 = minbil; // “Default memberwise assignment” // Alla datamedlemmars innehåll kopieras // Helt tillåtet... men bilnumret? Bildata::operator=(const Bildata & b) {/*kod*/} Även denna kan göras private för att förhindra tilldelnings-kopiering

20 Exceptions, konstruktor,destruktor, etc. sid. 20 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Copy assignment operator forts Bildata::operator=(const Bildata & b) { if (this != b) // objektet ska inte kopiera sej självt till sej självt! { // kopieringsjobbet } return *this; }


Download ppt "Exceptions, konstruktor,destruktor, etc. sid. 1 6/29/2015 CD5250 OOP med C++ Mats Medin MDH/IDT Enkel felhantering - assert() #include using namespace."

Similar presentations


Ads by Google