Översikt. Modern C++ Generisk programmering vs OOP. En titt i backspegeln... Generisk programmering. Objektorienterad programmering.

Relevanta dokument
Design mönster. n n n n n n. Command Active object Template method Strategy Facade Mediator

Kontrakt baserad design. Design by contract

Systemdesign fortsättningskurs

Analys av algoritmer. Beräkningsbar/hanterbar. Stora Ordo. O(definition) Datastrukturer och algoritmer. Varför analysera algoritmer?

Föreläsningar 7,8 sept 24, sept 26 v 39). delvis DD Chapter 6.

Återanvändning. Två mekanismer. Nedärvning av egenskaper (inheritance) Objekt komposition

Databaser - Design och programmering. Programutveckling. Programdesign, databasdesign. Kravspecifikation. ER-modellen. Begrepps-modellering

Datastrukturer och algoritmer

Mönster. n n n n n. Visitor Decorator Extension Object State Taskmaster

Tommy Färnqvist, IDA, Linköpings universitet

Egna funktioner. Vad är sin? sin är namnet på en av många inbyggda funktioner i Ada (och den återfinns i paketet Ada.Numerics.Elementary_Functions)

Mönster. n n n n n n n n n n. Singleton Monostate Null object Factory Composite Observer Abstract server Adapter Bridge Proxy

Svenska Segelflygförbundet Sida 1 av 5. Datum Felmeddelande Källa Företag Användare Grupp. Form, Form, Form,

Webprogrammering och databaser. Begrepps-modellering. Exempel: universitetsstudier Kravspec. ER-modellen. Exempel: kravspec forts:

Databaser - Design och programmering. Databasdesign. Kravspecifikation. Begrepps-modellering. Design processen. ER-modellering

101. och sista termen 1

Borel-Cantellis sats och stora talens lag

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

Induktion LCB Rekursion och induktion; enkla fall. Ersätter Grimaldi 4.1

Förfrågan till Klockarens redaktörer

Digitalteknik F6. Några sammansatta digitala komponenter och lite designmetodik. Digitalteknik F6 bild 1

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tentamen *:85/2I4123 C

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Duo HOME Duo OFFICE. Programmerings manual SE

Innehåll. Pekare Exempel

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

Innehåll. Pekare Exempel

Övningar Dag 2 En första klass

REGULJÄRA SPRÅK (8p + 6p) 1. DFA och reguljära uttryck (6 p) Problem. För följande NFA över alfabetet {0,1}:

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

Det finns många flaggor till g++,

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Objektorienterade programmeringsspråk. Objektorienterade språk. Den objekt-orienterade modellen. Jämför med icke-oo

Imperativ programmering. Föreläsning 4

TDIU01 - Programmering i C++, grundkurs

Vi har... Diskuterat olika objektorienterade mekanismer. Ha också tagit upp några krav på hur dom här mekanismerna ska användas

MS-A0409 Grundkurs i diskret matematik Sammanfattning, del I

Programmering A. Johan Eliasson

Algoritmbiblioteket (STL) Designstrategi Generiska algoritmer som fungerar på godtyckliga samlingsdatatyper, vilka har iteratorer.

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

2D1387 Programsystemkonstruktion med C++ Laboration 1: Grundläggande C++ 31 augusti 2005

Subsystem. Klasser är ett bra sätt att organisera små system. Klasser är för små enheter för att organisera stora system

Tommy Färnqvist, IDA, Linköpings universitet

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Föreläsning 10: Kombinatorik

TDDC76 - Programmering och Datastrukturer

Databaser - Design och programmering. Databasdesign. Funktioner. Relationsmodellen. Relationsmodellen. Funktion = avbildning (mappning) Y=X 2

Linjär Algebra (lp 1, 2016) Lösningar till skrivuppgiften Julia Brandes

grundläggande C++, funktioner m.m.

Datorövning 2 Fördelningar inom säkerhetsanalys

Innehåll Grafräknaren och diskret matematik...1 Vad handlar diskret matematik om?...1 Permutationer och kombinationer...3 Något om heltalsräkning...

Vad är det okända som efterfrågas? Vilka data är givna? Vilka är villkoren?

Z-Testet. Idè. Repetition normalfördelning. rdelning. Testvariabel z

Statistisk analys. Vilka slutsatser kan dras om populationen med resultatet i stickprovet som grund? Hur säkra uttalande kan göras om resultatet?

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

OOP Objekt-orienterad programmering

Föreläsning REPETITION & EXTENTA

c n x n, där c 0, c 1, c 2,... är givna (reella eller n=0 c n x n n=0 absolutkonvergent om x < R divergent om x > R n n lim = 1 R.

Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

TDIU01 - Programmering i C++, grundkurs

vara ett polynom där a 0, då kallas n för polynomets grad och ibland betecknas n grad( P(

Introduktion till statistik för statsvetare

TDIU01 Programmering i C++

. Mängden av alla möjliga tillstånd E k kallas tillståndsrummet.

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Så här kommer byggherren och entreprenören överens om energianvändningen

TMS136: Dataanalys och statistik Tentamen med lösningar

Minsta kvadrat-metoden, MK. Maximum likelihood-metoden, ML. Medelfel. E(X i ) = µ i (θ) MK-skattningen av θ fås genom att minimera

Armin Halilovic: EXTRA ÖVNINGAR

SANNOLIKHETER. Exempel. ( Tärningskast) Vi har sex möjliga utfall 1, 2, 3, 4, 5 och 6. Därför är utfallsrummet Ω = {1, 2, 3, 4, 5,6}.

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Höftledsdysplasi hos dansk-svensk gårdshund - Exempel på tavlan

Classes och Interfaces, Objects och References, Initialization

TDDC76 - Programmering och Datastrukturer

Föreläsning 3. Stack

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

b) Bestäm det genomsnittliga antalet testade enheter, E (X), samt även D (X). (5 p)

TDDC30 Programmering i Java, Datastrukturer och Algoritmer Lektion 2. Länkade listor Stackar Köer MyList Iteratorer Lab 2 Exceptions Paket

Datastrukturer. föreläsning 3. Stacks 1

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Parameteröverföring. Exempel. Exempel. Metodkropp

Planering Programmering grundkurs HI1024 HT TIDAA

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Inledande matematisk analys (TATA79) Höstterminen 2016 Föreläsnings- och lekionsplan

DEL I. Matematiska Institutionen KTH

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Föreläsning 3-4 Innehåll

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Första exemplet. Kompilator & länkare. Projekt. Övning 1, Ögrupp 4, Programsystemkonstruktion med C++, Ronnie Johansson,

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Intro till standardbiblioteket. Eric Elfving

Klassdeklaration. Metoddeklaration. Parameteröverföring

Transkript:

Moder C++ Översikt Mattias Flodi Geerisk programmerig vs OOP Stadard Template Library (STL) Partiell specialiserig Metaprogrammerig med templates Policybaserad desig Expressio templates Geerativ programmerig Geerisk programmerig vs OOP E titt i backspegel... C++ is ot a purely Object- Orieted Laguage. It is a laguage that supports Object-Orieted Programmig. Procedurell programmerig: Bestäm vilka procedurer du vill ha; aväd de bästa algoritmera du ka hitta. Modulär programmerig: Bestäm vilka moduler du vill ha; dela upp programmet så att data göms iom modulera. Dataabstraktio: Bestäm vilka datatyper du vill ha; tillhadahåll e full uppsättig operatioer för varje typ. Objektorieterad programmerig Geerisk programmerig Bestäm vilka klasser du vill ha Tillhadahåll e full uppsättig operatioer för varje klass Uttryck gemesamhet med arv Bestäm vilka algoritmer du vill ha Parameterisera dem så att de fugerar för e mägd olika typer och datastrukturer 1

Exempel: Byta plats på variabler void swap(t& a, T& b) T temp=a; a=b; b=temp; Exempel: E stackdatatyp template <typeame Type, it Size=100> class Stack Stack(); void push(type); Type pop(); private: Type values[size]; it top; template <typeame Type, it Size> void Stack<Type>::push(Type value) values[top++] = value; template <typeame Type, it Size> T Stack<Type>::pop() retur values[--top]; E stackdatatyp... Att täka på it mai() Stack<it> stk; stk.push(3); it popped_it = stk.pop(); Stack<strig> stk2; stk2.push("hello World"); strig popped_str = stk2.pop(); retur 0; E parameteriserad klass/fuktio kompileras om för varje y parameteruppsättig Kompilerig tar lägre tid Implemetatioe måste ofta fias i.h-file för att de ska vara tillgäglig för kompilator Vissa parameterval ka ge kompilerigsfel, adra ite Måga uika parameteruppsättigar ka leda till stora programfiler Stadard Template Library (STL) Ortogoal desig Utvecklades av Alex Stepaov och Meg Lee som ett mågårigt forskigsprojekt i Scheme, Ada och C++ Accepterades av stadardiserigskommité 1994 Tillhadahåller geeriska datatyper och algoritmer Implemeterar allt frå DOA och mer därtill... set list deque vector Iteratorer frot_isert_iterator ostream_iterator back_isert_iterator reverse_iterator raw_storage_iterator accumulate fid sort copy Algoritmer Behållare 2

Specialiserig Partiell specialiserig vector<bool> aväder oödigt mycket mie Ka effektiviseras med e skräddarsydd specialiserig class vector; template <> class vector<bool> Mer geerellt ka vi specialisera m.a.p. vissa parametrar. Detta går bara att göra med klasser. template <typeame Type, it Size> class Stack; // Matchar Stack<bool, N> för alla N template <it Size> class Stack<bool, Size> Partiell specialiserig... Partiell specialiserig... Kompilator möstermatchar för att hitta de mest passade implemetatioe class set; // Matchar alla typer som är pekare class set<t*> Äu mer komplicerat: class vector<pair<t, it> > Kaske käs ige... mis i ML? fu first x = il (head::tail) = head; Metaprogrammerig med templates Me, me... VARFÖR? Templates beskriver ett fuktioellt språk Ett program i språket körs uder kompilerige Ka aväda heltal och datatyper som argumet till fuktioer Går att implemetera if-the-else, listor, assertios, osv Metaprogrammerig är viktig för geerisk programmerig och för optimerig av program Ka t.ex. avädas för att ta reda på egeskaper hos parametrar template <typeame T1, typeame T2> class coversio static bool helper(t2); static double helper(...); static T1 maket1(); eum exists = (sizeof(helper(maket1())) == sizeof(bool)) 3

Exempel: Fiboacciserie If/The/Else-satser I ML: fu fib 0 = 0 fib 1 = 1 fib x = fib (x-1) + fib (x-2); Med templates: template <it X> struct fib eum Result = fib<x-1>::result + fib<x-2>::result template <> struct fib<0> eum Result = 0 template <> struct fib<1> eum Result = 1 template <bool Cod, typeame T, typeame U> struct Select; template <typeame T, typeame U> struct Select<true, T, U> typedef T Result; template <typeame T, typeame U> struct Select<false, T, U> typedef U Result; E lista med typer Beräkig av e listas lägd Defiieras rekursivt template <typeame T, typeame U> struct Typelist typedef T Head; typedef U Tail; Listas slut markeras med e tom datatyp, motsvarade MLs il struct NullType E typlista med olika heltalstyper: typedef Typelist<short, Typelist<it, Typelist<log, NullType> > > ItegerTypes; Görs rekursivt med NullType som basfall template <class TList> struct Legth; template <> struct Legth<NullType> eum Result = 0 template <class T, class U> struct Legth< Typelist<T, U> > eum Result = 1 + Legth<U>::Result Idexerig i e lista Metaprogram för optimerig På likade sätt template <class TList, it idex> struct TypeAt; template <typeame Head, typeame Tail> struct TypeAt<Typelist<Head, Tail>, 0> typedef Head Result; template <typeame Head, typeame Tail, it i> struct TypeAt<Typelist<Head, Tail>, i> typedef typeame TypeAt<Tail, i-1>::result Result; Exempel: Bubblesort för små arrayer void bubblesort(it* data, it N) for(it i = N-1; i>0; --i) for (it j = 0; j < i; ++j) if(data[j] < data[j+1]) swap(data[j], data[j+1]); 4

Mågfalde i mjukvarudesig Vi ka ite göra allt i ett grässitt! Problem: Det fis måga korrekta sätt att göra samma sak Igetig är helt rätt eller helt fel Olika problem kräver olika lösigar Hur ska ma skriva ett bibliotek så att alla ka aväda det? Mosterklasser är hopplösa att lära sig Explosiv programstorlek Lågsamma program Svårt att uderhålla Förlust av statisk typiformatio Om vi gör olika klasser för olika val? Policybaserad desig Försök göra flera olika klasser: SigleThreadedSmartPtr, MultiThreadedSmartPtr, RefCoutedSmartPtr, RefLikedSmartPtr,... Problem: Kombiatorisk explosio!... och mista förädrig är ett mastodotjobb The bottom lie: Desigvale måste kua göras av avädare, ite bara av skapare Moder C++, Adrei Alexadrescu E policy defierar e klass som styr utseede och beteede hos e aa klass Som template-parameter ka e policy vid kompilerig avgöra iehållet i e klass Exempel: Creator E policy för hur objekt ska skapas Implemeteras som e template-klass Tillhadahåller e create-fuktio template <class T> struct OpNewCreator static T* create() retur ew T; Fler val... template <class T> struct MallocCreator static T* create() void* buf = std::malloc(sizeof(t)); if(!buf) retur 0; retur ew(buf) T; template <class T> struct PrototypeCreator PrototypeCreator(T* pobj = 0) : pobj_(pobj) T* create() retur pobj_? pobj->cloe() : 0; T* get_prototype() retur pobj_; void set_prototype(t* pobj) pobj_ = pobj; private: T* pobj_; 5

Avädig E smart poiter desigval Template-klasser ka skickas som templateparametrar template <template <class T> class CreatioPolicy> class WidgetFactory : public CreatioPolicy<Widget>... typedef WidgetFactory<OpNewCreator> MyWidgetFactory; Hur ska klasse veta är objektet ska förstöras? - Referesräkig - Läkad lista - Djup kopierig -... Ska implicit typkoverterig tillåtas? Kotroll av pekarvärdet? Isåfall är? Hur rapportera fel? Allt detta är upp till avädare... Att täka på template < typeame T, template <class> class OwershipPolicy = RefereceCouted, class CoversioPolicy = DisallowCoversio, template <class> class CheckigPolicy = AssertCheck, > class SmartPtr; typedef SmartPtr<Widget, DeepCopy, AllowCoversio> WidgetPtr; Vi vill udvika virtuella fuktioer Destruktor bör vara protected När policies ärvs ka de berika grässittet Kopierig bör göras på per policy-basis Sträva efter ortogoala policies Ortogoalitet hos policies Expressio templates struct IsArray T& at(t* ptr, it idex) retur ptr[idex]; cost T& at(t* ptr, it idex) cost retur ptr[idex]; struct <typeame T> struct IsNotArray Uppfas oberoede ca 1995 av flera forskare; Todd Veldhuize, David Vadervoorde,... Ett sätt att skicka hela uttryck till fuktioer Jfr. LISPs och MLs lambdafuktioer Uttrycket ilieas i fuktioskroppe Aväds t.ex. för matris- och vektorberäkigar Ka ge 2-15 ggr sabbare program (!) 6

Exempel på avädig Hur fugerar det? it x=1; cout << (_1 * 2)(x); vector<it> v(10); vector<it*> vp(10); for_each(v.begi(), v.ed(), _1 += 2); trasform(v.begi(), v.ed(), vp.begi(), &_1); Överlagra operatorer så att de returerar ett uttrycksobjekt som represeterar uttrycket Datatype hos objektet ka beskriva ett parseträd för uttrycket sort(vp.begi(), vp.ed(), *_1 > *_2); for_each(vp.begi(), vp.ed(), cout << *_1 << edl); Geerativ programmerig Exempel: MTL vs BLAS Tillsammas blir dessa tekiker som små kodgeererare Mägde fuktioalitet växer expoetiellt med atalet geeriska klasser Kraftfull, specialiserad och högpresterade kod ka automatiskt växa ur ågra få, elemetära kompoeter BLAS: Basic Liear Algebra Subrouties - 154 495 ord, över 10,000 rutier MTL: Matrix Template Library - Gjordes som exjobb av Jeremy Siek - 15 184 ord - Sabbare - Lättare att aväda Istället för O(N*M) får vi O(N+M) MTL vs BLAS... Sammafattig Geerisk programmerig kompletterar OOP STL är ett geeriskt bibliotek som fis i stadarde Metaprogrammerig är ett kraftfullt och ödvädigt verktyg för geeriska bibliotek Policybaserad desig låter avädare forma biblioteke efter behov Med expressio templates, metaprogrammerig o.s.v. ka abstraktio OCH prestada uppås 7