Föreläsning 6

  • View
    29

  • Download
    0

Embed Size (px)

DESCRIPTION

Frelsning 6. Klassmallar. Templates kan givetvis ven anvndas fr klasser Standardutseende. template < class T> // Klassdefinition (*.h) class C { returtyp metod(parametrar); ... };. template < class T> // Def. av metod (*.h) returtyp C::metod(parametrar) { ... }. - PowerPoint PPT Presentation

Transcript

  • Frelsning 6

  • KlassmallarTemplates kan givetvis ven anvndas fr klasserStandardutseendetemplate // Klassdefinition (*.h) class C { returtyp metod(parametrar); ... };template // Def. av metod (*.h) returtyp C::metod(parametrar) { ... }

  • Templates i templatesTemplatiserade klasser kan ta templates som argumentstd::vector vektor;Observera; mellanslag mellan de avslutande hakarna!

  • Egna NamespacesFr att skapa ett eget namespace att lgga klasser i anvnder man nyckelordet namespaceStandardutseendeNamespace jms { template class Matrix { returtyp metod(parametrar); ... }; }

  • Egna Namespaces3 olika stt att komma t klassen Matrixjms::Matrix matrix;Anvnder uttryckligen en klass i ett specifikt namespaceusing namespace jms; Matrix matrix;Anvnder hela jms namespace (risk fr kollisioner)using jms::Matrix; Matrix matrix;Anvnder endast en delmngd av jms namespace (Matrix)

  • typeidI vissa fall vill man kunna avgra ett objekts egentliga klassDetta kan lsas med operatorn typeidvoid fordonsinfo(Fordon * fp) { if (typeid(*fp) == typeid(Personbil)) cout
  • UpcastVi har tidigare sett att man kan behandla specialiserade klasser p samma stt som mindre specialiserade klasservoid main() { Personbil bil; // Personbil skickas som ett Fordon fordonsinfo(&bil); }void fordonsinfo(Fordon * fp) { // Vi kan anropa Fordons alla medlemmar // Vi kan INTE anropa Personbils medlemmar! };

  • typecastVi kan anvnda explicit typomvandling fr att konvertera t andra hlletVi kan konvertera frn vilken klass som helst till annan valfri klassIngen sker metod eftersom vi teoretiskt sett kan typomvandla frn ett Dggdjur till en Bil vilket ger en verhngande risk fr programkrasch

  • typecastvoid main() { Horse horse; Car * car1 = &horse; // kompilatorn varnar Car * car2 = (Car*)&horse; // accepteras car2->ShiftGear(3); // PROGRAMKRASCH! }

  • DowncastFr att gra en typsker typomvandling finns i C++ specialoperatorn dynamic_castC++ kontrollerar att objektet verkligen r av rtt typ fr att en sker typomvandling skall kunna skeKlassen mste vara polymorf (virtuella metoder)void fordonsinfo(Fordon * fp) { Personbil * bil; bil = dynamic_cast(fp); if (bil) cout
  • FelhanteringFelhantering i C r ganska besvrligOftast returneras felmeddelanden frn funktioner. Returvrdena mste sedan kontrolleras samt hantera eventuella felOm en funktion returnerar ett objekt r det svrt att bestmma nr ett fel har uppsttt.Kan ge konstiga konstruktioner

  • Exempel (felhantering)void main() { // division med noll! float resultat = dividera(5.0f, 0.0f); // vad r ett felaktigt returvrde i // detta fall? }float dividiera(float taljare, float namnare) { // hur hanterar vi division med noll? return taljare/namnare; };

  • Exempel (felhantering C)void main() { int resultat; int retur = dividera(5.0f, 0.0f, &resultat); if (retur = 0) // Division med noll!! }int dividiera(float taljare, float namnare, float result) { if (taljare == 0) return 0; *result = taljare/namnare; return 1; };

  • Exempel (felhantering C++)void main() { int result; try { result = dividera(5.0f, 0.0f); } catch (char * str) { // Division med noll!! } }float dividiera(float taljare, float namnare) { if (taljare == 0) throw Division by zero; return taljare/namnare; };

  • ExceptionsExceptions kan anvndas nr det uppstr undantagsfel i programmetExempelvis om minnet tar slut, inlsning av en trasig fil, avbruten kommunikation m.m.Exceptions ger frdelen att programmeraren kan frutstta att allt gr bra, men ifall det skulle uppst problem s kan dessa hanteras

  • ExceptionsEtt exception slngs med operatorn throwValfritt objekt kan slngasKlasshierarkier med olika Exception-objekt kan med frdel anvndasObjektet returneras bakt i anropshierarkin tills det fngas av en try catch rutin

  • ExceptionsExceptions kan ge en felhantering p hg nivFelet behver inte tas omhand i den felande funktionen eller i den direkt anropande funktionenHantering av fel r inte alltid mjlig i den direkta nrheten dr felet uppstr, men kan med exceptions hanteras hgre upp i anropshierarkin

  • ExceptionsStandardbiblioteket har en definierad klasshierarki av exception-objektinvalid_argumentout_of_rangelength_errordomain_errorexceptionlogic_errorruntime_errorrange_erroroverflow_errorunderflow_errorbad_allocbad_cast

  • Flera catch-uttryckvoid main() { try { File file(c:\kalle.txt); string str = file.ReadString(); } catch (OutOfMemoryException e) { // Slut p minne vid inlsning } catch (BadFileFormatException e) { // Felaktigt filformat } catch (Exception e) { // Andra standardfel som kan uppst } catch (...) { // Fnga ALLA andra fel hr (DivisionByZero m.fl.) } }

  • Flera catch-uttryckEtt try-catch block kan ha flera catch-uttryck fr att hantera flera olika felEndast ett catch-uttryck exekverasDet frsta som matcharEllipsis () fngar alla felOm denna anvnds br den vara sist av catch-uttrycken

  • Slng undantagsfelSyntax:throw 4;throw Klass();throw Klass(konstruktorparametrar);Flera olika undantagsfel (objekt) kan slngas frn en metod, men endast en i taget

  • Skicka vidare exceptionsEn metod kan behva fnga undantagsfel utan att kunna hantera feletExempelvis kan en metod avallokera minne fr att undvika minneslckage. Fr att sedan vidare hantering av felet skall ske s kan metoden skicka vidare felet med throw; i catch-uttrycket

  • Skicka vidare void function() { try { File file(c:\kalle.txt); string str = file.ReadString(); } catch (...) { cout
  • Vad hnder vid exceptions?Stack unwind anropsstacken plockas nedObjekt p varje niv destruerasMinneslckageriskOm man allokerat minne mste detta avallokeras. Lmpligen genom att fnga felet, avallokera minnet samt skicka exception-objektet vidare.

  • Hndelsestyrd programmeringProgrammet r passivtProgrammet ligger inaktivt s lnge ingenting hnderLmpliga metoder anropas automatiskt nr vissa kriterier r uppfylldaMusrrelser, Knapptryckningar m.m.

  • FrdelarProgrammet slipper pollande loopar, dvs loopar som hela tiden ligger och kollar om ngonting skall gras.Mindre processortgngViktigt i multiprocessystem (windows)Programmet kan koncentrera sig p att utfra uppgifter istllet fr att underska vad som skall gras

  • MFCMicrosoft Foundation ClassesKlasspaket (framework)Klasser fr att programmera windows-programBygger p Win32 API (application programming interface)Hndelsestyrt

  • Viktiga MFC-KlasserCCmdTargetCObjectCWndCFrameWndCViewCWinThreadCWinAppCDocumentCDCBasklass som alla MFC-klasser rver frnSkter hantering av meddelanden inom/mellan objektBasklass som hanterar alla grafiska ytorAlla fnster rver frn dennaHanterar utritning av innehllet i CFrameWndTrdhantering (multithreading)MFC-applikationer brjar i denna klassMotsvarande Modellen i Model-View-ControllerAnvnds vid all utritning till CWnd-objekt

  • Nyttiga MFC-KlasserCPointCSizeCRectCStringCTimePoint-klass, liknande de som skapats i laborationernaHanterar storlekar (kompletterar CPoint)Beskriver rektanglar och dess operationerStrnghantering, liknande std::stringOperationer fr tidsberkningar

  • MFC-WizardI Visual C++ fr man fljande upplgg av MFC Wizard (projekttyp)Klass hrledd frn CWinAppStartar och initierar windows-programmetKlass hrledd frn CFrameWndSkter allt specifikt fr applikationsfnstretKlass hrledd frn CViewSkter all utritning av data frn CDocumentKlass hrledd frn CdocumentHanterar all applikationsdata

  • Projektskelett (Bounce)CBounceAppCMainFrameCBounceViewCBounceDocSkaparInnehllerKnner till