Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Relevanta dokument
Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

Kapitel 6 - Undantag

Synlighet. Namespace Scope-operatorn Klasser Vänner

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Det finns många flaggor till g++,

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Dynamisk bindning och polymorfism

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

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

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

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

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

F8: Typkonvertering i C++

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

C++-programmets beståndsdelar

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Innehåll. Pekare Exempel

allokeras på stacken dynamiskt new delete

Programsystemkonstruktion med C++

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

TDIU01 Programmering i C++

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

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

2D1387, Programsystemkonstruktion med C++ 01/02 1

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

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

KLASSER. Inkapsling Abstrakt datatyp Public och private. Klassmedlemmar Datamedlemmar Exempel Funktionsmedlemmar

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

Tentamen EDAF30 Programmering i C++

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

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

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Innehåll. Pekare Exempel

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

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

SP:PROG3 HT12 Tenta

TDDC76 - Programmering och Datastrukturer

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

*:85/ID200V C++ HT07. Föreläsning 8 Medlemspekare Undantagshantering Namnrymder

Tentamen i DD2387 Programsystemkonstruktion med C++

Skapa, kopiera och destruera klassobjekt

Tillämpad programmering

Föreläsning 8. Arv. Arv (forts) Arv och abstrakta klasser

Programmering B med Visual C

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

Introduktion till arv

Kapitel 5. Strömmar. Utmatning

Tentamen i TDP004 Objektorienterad Programmering Teoretisk del

Arv: Fordonsexempel. Arv. Arv: fordonsexempel (forts) Arv: Ett exempel. En klassdefinition class A extends B {... }

TDDC76 - Programmering och Datastrukturer

1 Namnkontroll (NameControl)

Exempelvis pekarvariabler blir då lättare korrekt deklarerade och initierade.

Tentamen *:85/2I4123 C

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

1 Klasser och objektorientering Vad är objektorientering?

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

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

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

5 Arv och dynamisk bindning FIGUR

DD2387 Programsystemkonstruktion med C++ Tentamen 2

Det objektorienterade synsättet. Objekt. Datorprogrammet kan uppfattas som en slags modell av den verklighet programmet skall samverka med.

TDDC76 - Programmering och Datastrukturer

Vad är en klass? Övning 2. Konstruktorer. ffl copy-konstruktorn tar en instans av klassen som. ffl default-konstruktorn tar inga argument och kan

Tommy Färnqvist, IDA, Linköpings universitet

Objektorienterad Programkonstruktion. Föreläsning 7 24 nov 2015

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

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

Minnestilldelning (allokering) och frigörande (avallokering) av minne

TDDC76 Programmering och datastrukturer

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Programsystemkonstruktion med C++

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

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

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

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

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

DD2387 Programsystemkonstruktion med C++ Tentamen 3 Onsdagen 7 januari, 14:00-18:00

TDIU01 - Programmering i C++, grundkurs

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Laboration A Objektsamlingar

Kapitel 4. Funktionsmallar. Mallar. Introduktion till mallar STL

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

1. Klass med en dynamiskt allokerad variabel, definitionsfilen-del Klass med en dynamiskt allokerad variabel, inkluderingsfilen.

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

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

Objekt-orienterad programmering. Klassbegreppet och C++ UML. UMLs fördelar

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

Övningar Dag 2 En första klass

Tentamen i DD2387 Programsystemkonstruktion med C++

Föreläsning 8 Programmeringsteknik och Matlab 2D1312/2D1305. Klass Object, instans av klass public/private Klassvariabler och klassmetoder

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Transkript:

Övriga byggstenar Beroenden Pekare till funktioner Övriga byggstenar Beroenden er Definitioners synlighet Funktionspekare Icke-medlemsfunktioner Medlemsfunktioner 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 2 Några tips under programutveckling - att spara tid Minska utveckligstiden: Minimera antal beroenden mellan filerna Skapa ett projekt / använd make. Automatisering lönar sig alltid! Använd debuggern flitigt Undvik dynamisk allokering Undvik att läcka eventuellt dynamiskt minne genom att matcha allokering i konstrukor med deallokering i destruktor. Några tips under programutveckling - att spara tid Minska utveckligstiden: Använd const på rätt sätt ändringar i efterhand kan bli mycket omfattande const hjälper dig att hitta fel Bryt ut gemensam funktionalitet och lägg i rätt klass. Tänk på vad som hör / inte hör hemma i basklassen 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 3 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 4 2D1387 Programsystemkonstruktion med C++ 1

Beroenden För att minska kompileringstiderna vill man ha så få beroenden som möjligt mellan filer: Undvik att inkludera onödiga filer i dina headerfiler. Undvik att använda inline på funktioner som använder annat objekt eftersom dess definition då måste vara synlig. Använd framåtdeklaration där detta är möjligt. När kan man använda framåtdeklaration av en klass och när måste definitionen vara synlig? Definitionen måste vara synlig för alla basklasser Definitionen måste vara synlig då man definierar objekt, t.ex. som medlem Definitionen måste vara synlig då man använder objekt, t.ex. använder en av objektets funktioner 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 5 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 6 Definitionen behöver ej vara synlig i övriga fall! Exempel: Pekare eller referens till objekt Returtyp i deklaration av funktion Argument i deklaration av funktion Användning av typen i typdeklaration eller som malltyp Exempel på framåtdeklaration av klasser // i filen A.h #include "D.h" // inkludera D:s definition class B; // (framåt)deklaration av B class C; // (framåt)deklaration av C class A // definition av klassen A B foo(b); // B behöver ej vara definierad! C *bar(); // C behöver ej vara definierad B &b; // B behöver ej vara definierad D c; // ok: D är definierad B b; // fel: B måste vara definierad std::vector<b> v; // B behöver ej vara definierad 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 7 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 8 2D1387 Programsystemkonstruktion med C++ 2

Klassdefinitionen måste vara synlig vid användning // i filen A.cpp #include "A.h" // A måste vara definierad #include "B.h" // B måste definieras eftersom // foo() använder och returnerar B extern C *get_cp(); // get_cp definierad i annan fil B A::foo(B) return B(); // B måste vara definierad } C *A::bar() C *p = get_cp(); // returnerar pekare till C return p; // C behöver ej vara definierad } // om vi inte använder C Undvik beroenden pimpl-idiomet Pointer to implementation Undvik beroenden i headerfiler genom extra indirektion genom pekare Fördelar: få beroenden!, stora headerfiler (typ windows.h) kan ofta helt elimineras från dina headerfiler Nackdelar: extra avreferering, extra objekt + dynamisk allokering 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 9 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 10 Undvik beroenden // i fil.h class Impl; class A public: A(); ~A(); int foo(); private: Impl *impl; // framåtdeklaration // definieras i fil.cpp // implementeras i Impl // pekare till implementation // i fil.cpp class Impl // här definieras Impl! //...och ingen kommer åt den public: B hidden1; // dessa medlemmar låg förut i A C hidden2; //...vi gömmer dem i Impl! int foo() return 0; } // utför A::foo()s arbete Funktionspekare Pekare till funktioner Pekare till medlemsfunktioner A::A() impl = new Impl; } // allokera A::~A() delete impl; } // deallokera int A::foo() return impl->foo(); } // skicka vidare 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 11 2D1387 Programsystemkonstruktion med C++ 3

Pekare till funktioner Antag att vi har en lista och vill använda eller manipulera varje element En funktionspekare ger oss en möjlighet att slippa upprepa kod Vi applicerar funktionspekaren iterativt, dvs på vart och ett av elementen i listan Pekare till funktioner typedef void (*fp)(int &); // funktionspekare void iterate(int a[], int size, fp action) for(int j = 0; j < size; j++) action(a[j]); } void mod3(int &i) i %= 3; } // rest vid division void print(int &i) std::cout << i << " "; }... int a[7] = 1, 2, 3, 4, 5, 6, 7 iterate(a, 7, mod3); iterate(a, 7, print); // ger utmatning 1 2 0 1 2 0 1 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 13 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 14 Pekare till medlemsfunktioner Precis på samma sätt som man pekar på globala funktioner kan man peka på funktioner i klasser Dessa funktionspekare är lite speciella eftersom de måste ha tillgång till en thispekare Pekare till medlemsfunktion är egentligen en offset som pekar ut den funktion som ska köras Pekare till medlemsfunktioner class A public: void foo(int) } static void bar(int) } typedef void(*fp)(int); fp p1 = &A::foo; // fel: foo är void(a::*)(int) fp p2 = &A::bar; // ok: bar är void(*)(int) typedef void(a::*fpm)(int); fpm p3 = &A::foo; // ok: foo är void(a::*)(int) A a; (a.*p3)(4711); // kör foo från a A *pa = &a; (pa->*p3)(4711); // kör foo från a via pa 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 15 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 16 2D1387 Programsystemkonstruktion med C++ 4

Typinformation och konvertering Implicit och explicit konvertering Säker typkonvertering till nedärvd klass Man använder typkonvertering för att konvertera en typ till en annan Implicit konvertering, dvs automatisk, sker mellan de flesta inbyggda typer Pekare kan konverteras till voidpekare, pekare kan även konverteras till en basklasspekare Subklasser konverteras till basklassen 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 18 Olika typer av explicit konvertering: static_cast är motsatsen till implicit konvertering dynamic_cast är konvertering från basklass till subklass och kan bara lösas under körning reinterpret_cast är bitvis tolkning const_cast tar bort kvalifieraren const eller volatile const char str[] = "C++"; void *vp; vp = str; // fel: kastar bort const vp = (void *)str; // ok, men fult och otyligt vp = const_cast<char *>(str); // rätt sätt char *s = const_cast<char *>(str); // ok vp = s; // ok: samma kvalifierare s = reinterpret_cast<char *>(vp); // ok s = reinterpret_cast<char *>(str); // fel: const_cast // måste användas 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 19 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 20 2D1387 Programsystemkonstruktion med C++ 5

struct A virtual void f() } struct B : public A void f() } B b; A *ap = &b; B *bp = dynamic_cast<b *>(ap); extern void foo(double); foo(7); // bp!= 0 eftersom // ap pekar på b // implicit konvert // från int till dbl Typinformation under körning Genom operatorn typeid() får man en referens till en instans av klassen type_info som innehåller typinformation type_info har en metod name() som ger klassens namn int i = static_cast<int>(3.14); // explicit konvert // från dbl till int 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 21 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 22 Typinformation under körning Exempel på användning: class A A *a = new A; const type_info &ta = typeid(a); // typinfo på klass const type_info &ta = typeid(*a); // typinfo på objekt std::cout << ta.name() << std::endl; // namn på typ if(ta == ta) // typer kan jämföras std::cout << "They are the same" << std::endl; if(ta.before(ta)) // typer har en ordning std::cout << "ta is before ta" << std::endl; 2D1387 Programsystemkonstruktion med C++ Johnny Bigert 2002-2003 23 2D1387 Programsystemkonstruktion med C++ 6