Produktlinien mit C++-Templates

Größe: px
Ab Seite anzeigen:

Download "Produktlinien mit C++-Templates"

Transkript

1 Software ubiquitärer Systeme (SuS) Produktlinien mit C++-Templates Olaf Spinczyk AG Eingebettete Systemsoftware Informatik 12, TU Dortmund

2 Inhalt Motivation Templates für Fortgeschrittene Policy-Based Design Synthesizing Objects Zusammenfassung SuS: 06.2 Produktlinien mit C++-Templates 2

3 Motivation Produktlinienkomponenten müssen wiederverwendbar sein statisch/dynamisch konfigurierbar vom Anwendungsfall unabhängig (generisch) formuliert Welche Programmiersprachen-Mechanismen für die generische Programmierung können genutzt werden? ist GP noch besser geeignet als OO oder AO? Analyse am Beispiel von C++-Templates [1, 2] SuS: 06.2 Produktlinien mit C++-Templates 3

4 Inhalt Motivation Templates für Fortgeschrittene Policy-Based Design Synthesizing Objects Zusammenfassung SuS: 06.2 Produktlinien mit C++-Templates 4

5 Fortgeschrittene Templates Template-Parameter Typen, Konstanten und Templates Template-Spezialisierung Fallunterscheidungen zur Übersetzungszeit Template-Metaprogramme Programmierung zur Übersetzungszeit: gezielte Code-Generierung Introspection statische Analyse der vorhandenen Typen und es gibt noch viel mehr SuS: 06.2 Produktlinien mit C++-Templates 5

6 Nicht-Typ Template-Parameter neben Typen können auch konstante Ausdrücke als Template- Parameter benutzt werden Vector2.h template <typename T, int DIM> class Vector2 { T data[dim]; // in jedem Objekt steckt ein Array public: // Konstruktor, Copy-Konstruktor(!),... // Zugriffsfunktionen z.b. mit Indexprüfung: void set (int index, const T& obj); T get (int index) const; aber Achtung: Vector<int> v1(10) Vector<int> v2(20); // v1 und v2 haben den selben Typ Vector2<int,10> v2_1; // v2_1 und v2_2 haben Vector2<int,20> v2_2; // unterschiedliche Typen! SuS: 06.2 Produktlinien mit C++-Templates 6

7 Template-Template-Parameter Templates, die Templates benutzen sollen, können auch Templates als Parameter bekommen DataCollector.h template <template <typename> class Container> class DataCollector { Container<double> collected_data; // Container wird benutzt public: //... so wird s benutzt: Parameter ist ein Template mit einem Parameter DataCollector<Vector> dc; DataCollector<Vector2> dc2; // alles OK // geht nicht! // (Vector2 erwartet 2 Parameter) SuS: 06.2 Produktlinien mit C++-Templates 7

8 Default Template-Parameter ähnlich wie bei Default-Argumenten von Funktionen können auch Template-Parameter ein Default haben wie bei Funktionen müssen dann nachfolgende Parameter auch ein Default haben zwei Parameter mit Defaults DataCollector2.h template <template <typename,int> class Container=Vector2, int DIM=32> class DataCollector2 { Container<double, DIM> collected_data; // Container und DIM public: //... so wird s benutzt: DataCollector2<> c1; // auf <> kann man nicht verzichten DataCollector2<Vector2> c2; // DIM ist 32 per Default DataCollector2<FooBar, 10> c3; // Default nicht genutzt SuS: 06.2 Produktlinien mit C++-Templates 8

9 Template-Spezialisierung mit Hilfe der Template-Spezialisierung können unterschiedliche Template-Implementierungen in Abhängigkeit von den Parametern gewählt werden Explizite Template-Spezialisierung für einen bestimmten Parametersatz, z.b. Vector<bool> Partielle Template-Spezialisierung für eine Parametermenge, z.b. Vector<const T*> mit beliebigem T geht nicht bei Funktions-Templates wenn sowohl eine explizite als auch eine partielle Spezialisierung passen, wird die explizite gewählt passt keine Spezialisierung, wird das primäre Template genommen Template-Spezialisierung bewirkt eine Fallunterscheidung wichtige Grundlage für Template-Metaprogrammierung SuS: 06.2 Produktlinien mit C++-Templates 9

10 Explizite Template-Spezialisierung kann z.b. zur Optimierung benutzt werden: Vector.h template <> explizite Spezialisierung für bool class Vector<bool> { unsigned *data; // bool wird als Bit gespeichert int dim; public: // Konstruktor Vector(int d) { data = new unsigned[1 + (d-1) / (sizeof(unsigned)*8)]; } // Copy-Konstruktor(!), Zugriffsfunktionen,... mit der Spezialisierung für bool wird für Vector<bool> auf dem Heap nur ein Achtel des Speicherplatzes angefordert SuS: 06.2 Produktlinien mit C++-Templates 10

11 Partielle Template-Spezialisierung kann z.b. die gleiche Optimierung für Vector2 realisieren: Vector2.h template <int DIM> partielle Spezialisierung für bool und beliebige DIMension class Vector2<bool, DIM> { typedef unsigned storage_t; static const unsigned BITS = sizeof(storage_t) * 8; storage_t data[1 + (DIM - 1) / BITS]; public: // Konstruktor, Copy-Konstruktor(!),... // Zugriffsfunktionen z.b. mit Indexprüfung: void set (int index, bool obj) { if (obj) data[index / BITS] = (1 << (index % BITS)); else data[index / BITS] &= ~(1 << (index % BITS)); } // SuS: 06.2 Produktlinien mit C++-Templates 11

12 Template-Metaprogramme (1) durch rekursive Template-Instanziierung und Template- Spezialisierung können zur Übersetzungszeit Fallunterscheidungen und Schleifen ausgeführt werden: Fac.h // Fac<I>: instanziiert Fac<I-1> rekursiv template<int I> struct Fac { enum { RES = I * Fac<I-1>::RES // Spezialisierung für <0>: terminiert die Meta-Schleife template <> struct Fac<0> { enum { RES = SuS: 06.2 Produktlinien mit C++-Templates 12

13 Template-Metaprogramme (2) zur Übersetzungszeit ausgeführte Berechnungen kosten zur Laufzeit nichts: main: pushl %ebp movl %esp, %ebp pushl $5040 pushl $.LC0 main.cc call printf #include <stdio.h> leave #include "fac.h" xorl %eax, %eax ret int main () { printf ("%d\n", Fac<7>::RES); // hier entsteht eine // Instanziierungskette! } im generierten Assembler-Code steht das Ergebnis (5040) bereits fest! mit Metaprogrammen lässt sich praktisch alles berechnen: die Sprache ist Turing-vollständig SuS: 06.2 Produktlinien mit C++-Templates 13

14 Introspection mittels Template-Spezialisierung und dem Overload- Resolution-Mechanismus kann man zur Übersetzungszeit vieles über vorhandene Typen herausfinden, z.b.: template <typename Base> struct InheritDetector { typedef char (&no)[1]; typedef char (&yes)[2]; static yes test(base *); // Resultatsgröße ist 1 static no test(...); // Resultatsgröße ist 2 template <typename Derived, typename Base> struct Inherits { typedef Derived *DP; // sizeof ermittelt die Größe des Resultatsobjekts enum { RET = sizeof(inheritdetector<base>::test(dp())) == sizeof(typename InheritDetector<Base>::yes) SuS: 06.2 Produktlinien mit C++-Templates 14

15 Inhalt Motivation Templates für Fortgeschrittene Policy-Based Design Synthesizing Objects Zusammenfassung SuS: 06.2 Produktlinien mit C++-Templates 15

16 Policy-Based Design [3] Problemfeld Entwurfsentscheidungen wie man es macht, macht man es falsch Lösungen können je nach Anwendungsfall mehr oder weniger (oder gar nicht) geeignet sein Entscheidung sollte nicht beim Entwickler einer Klasse liegen, sondern beim Anwender Ziel: Klassen konfigurierbar gestalten Schaffung einer Auswahlmöglichkeit für verschiedene Verhaltensweisen durch den Anwender SuS: 06.2 Produktlinien mit C++-Templates 16

17 Idee von Policy-based Design Klassen mit komplexem Verhalten werden in eine Host-Klasse und mehrere kleinere Policy-Klassen zerlegt jede Policy kapselt einen Belang der Host-Klasse Verbindung der komplexen Host-Klasse mit den Policy-Klassen über C++-Templates Policies sind vom Benutzer der Klasse auswählbar der Benutzer kann also das Verhalten der Host-Klasse durch geeignete Auswahl von Policy-Klassen anpassen SuS: 06.2 Produktlinien mit C++-Templates 17

18 Beispiel: NewCreator ist ein Klassen-Template, das neue Objekte erzeugt: template <class T> class NewCreator { public: static T *create() { return new T; }... Widget *w = NewCreator<Widget>::create(); NewCreator erzeugt alle Objekte mit new in manchen Fällen könnte anderes Verhalten erwünscht sein SuS: 06.2 Produktlinien mit C++-Templates 18

19 Beispiel: MallocCreator Alternative zum NewCreator MallocCreator fordert Speicher mit malloc() an Objekt wird mit Placement New in den Speicher gelegt template <class T> class MallocCreator { public: static T *create() { void *buf = malloc(sizeof(t)); if (!buf) return 0; // oder Exception werfen return new(buf) T; // placement new }... Widget *w = MallocCreator<Widget>::create(); SuS: 06.2 Produktlinien mit C++-Templates 19

20 Beobachtung MallocCreator und NewCreator besitzen dieselbe Schnittstelle beide verfügen über die Methode create(), die ein neues Objekt erstellen soll eine gemeinsame abstrakte Basisklasse, die die gemeinsame Schnittstelle manifestieren würde, gibt es aber nicht NewCreator lässt sich trotzdem im Quellcode durch MallocCreator ersetzen statische Polymorphie SuS: 06.2 Produktlinien mit C++-Templates 20

21 Der Begriff Policy Policies sind Schnittstellen für konfigurierbare Belange einer Klasse Policy-Klassen implementieren die von der Policy vorgegebene Schnittstelle Beispiel: Creation Policy kapselt das Erstellen von neuen Objekten Schnittstelle besteht aus der Methode create(), welche ein neues Objekt erzeugen soll Templates NewCreator und MallocCreator sind mögliche Policy- Klassen; es sind aber noch weitere denkbar SuS: 06.2 Produktlinien mit C++-Templates 21

22 Verwenden der Policy Policy-Klassen werden bei der Übersetzung mittels Template- Parameter in die Host-Klasse eingebunden Beispiel: WidgetManager template <class CreationPolicy> class WidgetManager { public: void newwidget() { Widget *w = CreationPolicy::create();... } SuS: 06.2 Produktlinien mit C++-Templates 22

23 Auswahl der Policy-Klasse Anwender von WidgetManager können die Creation Policy nun auswählen: Mit NewCreator: typedef WidgetManager<NewCreator<Widget> > WM; oder mit dem MallocCreator: typedef WidgetManager<MallocCreator<Widget> > WM; Problem: Man muss immer Widget mit angeben, obwohl klar ist, dass der WidgetManager Widgets anlegen will SuS: 06.2 Produktlinien mit C++-Templates 23

24 Template-Template-Parameter Lösung: Host-Klasse bekommt die Policy-Klasse als Template-Template-Parameter übergeben: einfacher zu lesen weniger fehleranfällig: Benutzer gibt den Objekttyp nicht selbst an flexibler: WidgetManager kann auch andere Objekte erzeugen template <template <class> class CreationPolicy> class WidgetManager { public: void newwidget() { Widget *w = CreationPolicy<Widget>:create();... }... // jetzt kompakter und einfacher: typedef WidgetManager<NewCreator> WM; SuS: 06.2 Produktlinien mit C++-Templates 24

25 Weitere Möglichkeiten die Struktur der Host-Klasse ist durch Erben von der Policy- Klasse erweiterbar Host erbt Member-Variablen von den Policies Policies können zusätzliche Methoden in die Host-Klasse einbringen ( Enriched Policies ) Policies sind so nicht nur auf Verhalten beschränkt SuS: 06.2 Produktlinien mit C++-Templates 25

26 Entwurf einer Klasse mit Policies Auswahl der Policies Entscheiden, welche Belange durch Policies realisiert werden Schwierige Entwurfsentscheidungen in Policies auslagern bei mehreren Policies: möglichst orthogonale Semantik definieren Konsequenzen Policies müssen beim Entwurf der Host-Klasse festgelegt werden! nachträgliche Einführung zusätzlicher Policies schwierig (im Gegensatz zur Einführung weiterer Policy-Klassen) Policy ist im Code der Host-Klasse verankert join points sind damit explizit vorgegeben keine gute Möglichkeit zur Modularisierung querschneidender Belange SuS: 06.2 Produktlinien mit C++-Templates 26

27 Fazit Policy-based Design erlaubt die getrennte Realisierung konfigurierbarer Belange in Form von Policies ermöglicht flexible Klassen, deren Verhalten der Anwender an seine Bedürfnisse anpassen kann basiert auf Sprachelementen von C++ Templates Template-Template-Parameter ein größeres Anwendungsbeispiel jetzt: Synthesizing Objects SuS: 06.2 Produktlinien mit C++-Templates 27

28 Inhalt Motivation Templates für Fortgeschrittene Policy-Based Design Synthesizing Objects Zusammenfassung SuS: 06.2 Produktlinien mit C++-Templates 28

29 Synthesizing Objects [4] Welche Programmiersprachen-Mechanismen für die generische Programmierung können genutzt werden? C++-Templates! Wie beschreibt man Variabilität auf einem problemadäquaten abstrakten Niveau? Merkmalmodelle! Merkmal-getriebene Generierung mittels Templates SuS: 06.2 Produktlinien mit C++-Templates 29

30 Beispielszenario Merkmale eine Familie von Listen-Klassen List [ElementType] Ownership Morphology LengthCounter Tracing external reference owned reference copy polymorphic monomorphic [LengthType]... int short long SuS: 06.2 Produktlinien mit C++-Templates 30

31 Beispielszenario Architektur in Form einer (erweiterten) funktionalen Hierarchie optionale Merkmale werden optionale obere Schichten weitere Variabilität durch Konfigurierbarkeit der Schichten Basisschicht mit Konfigurationswissen Tracing Layer Counter Layer BasicList Config TracedList LenList PtrList Configuration Repository: Stellt Konfigurationsinformationen in Form von Typen zur Verfügung. Minimiert Abhängigkeiten zwischen den Schichten. ElementType : [ElementType] Destroyer : EmptyDestroyer ElementDestroyer TypeChecker : DynamicTypeChecker EmptyTypeChecker Copier : PolymorphicCopier MonomorphicCopier EmptyCopier LengthType : int short long... ReturnType SuS: 06.2 Produktlinien mit C++-Templates 31

32 PtrList (1) Daten und Typen template <class Config_> class PtrList { public: // Config als Member-Typ zur Verfügung stellen: typedef Config_ Config; private: // Weitere Typen aus dem Configuration Repository: typedef typename Config::ElementType ElementType; typedef typename Config::SetHeadElementType SetHeadElementType; typedef typename Config::ReturnType ReturnType; // Diese Typen repräsentieren Policies! typedef typename Config::Destroyer Destroyer; typedef typename Config::TypeChecker TypeChecker; typedef typename Config::Copier Copier; private: // Datenelemente ElementType *head_; // jede Liste speichert einen Zeiger auf 1 Element ReturnType *tail_; // weitere Elemente stecken in der Liste tail_ public: // Methoden (siehe nächste Folie) SuS: 06.2 Produktlinien mit C++-Templates 32

33 PtrList (2) Methoden // Konstruktor: erzeugt eine neue Liste PtrList(SetHeadElementType &h, ReturnType *t=0) : head_(0), tail_(t) { sethead(h); } // Destruktor: ggf. das referenzierte Element löschen ~PtrList() { Destroyer::destroy (head_); } // Initialisierung des Elements: ggf. Typprüfung und Kopie void sethead(setheadelementtype &h) { TypeChecker::check(h); head_ = Copier::copy(h); } // Setter- und Getter-Funktionen ElementType &head() { return *head_; } void settail(returntype *t) { tail_ = t; } ReturnType *tail() const { return tail_; } wozu eigentlich SetHeadElementType&? je nachdem, ob die Elemente kopiert werden, ist das ElementType& oder const ElementType& SuS: 06.2 Produktlinien mit C++-Templates 33

34 Policies (1) Destroyer template <class ElementType> struct ElementDestroyer { static void destroy(elementtype *e) { delete e; // Heap speicher wird freigegeben, Destruktor ausgeführt } template <class ElementType> struct EmptyDestroyer { static void destroy(elementtype *e) { // NICHTS! } der ElementDestroyer muss verwendet werden, wenn die Liste Elemente vor dem Einfügen kopiert Aufrufe von EmptyDestroyer::destroy() kann der Optimierer komplett eliminieren! SuS: 06.2 Produktlinien mit C++-Templates 34

35 Policies (2) TypeChecker template <class ElementType> struct DynamicTypeChecker { static void check(const ElementType &e) { // Typüberprüfung mittels RTTI zur Laufzeit (Debug-Modus) assert(typeid(e) == typeid(elementtype)); } template <class ElementType> struct EmptyTypeChecker { static void check(const ElementType &e) { // NICHTS } der DynamicTypeChecker sorgt dafür, dass alle Elemente der Liste den selben Typ haben (monomorphic list) und noch eine Klasse, die NICHTS tut SuS: 06.2 Produktlinien mit C++-Templates 35

36 Policies (3) Copier template <class ElementType> struct PolymorphicCopier { static ElementType *copy(const ElementType &e) { return e.clone(); // Kopieren mittels einer virtuellen Methode } template <class ElementType> struct MonomorphicCopier { static ElementType *copy(const ElementType &e) { return new ElementType(e); // Kopieren mittels Copy-Konstruktor } template <class ElementType> struct EmptyCopier { static ElementType *copy(elementtype &e) { return &e; // liefert einfach das Original } SuS: 06.2 Produktlinien mit C++-Templates 36

37 Zwischenfazit Traits & Policies unser PtrList-Template ist hochgradig generisch: variable Aktivitäten werden durch Policies realisiert der Zugriff auf die richtige Policy-Klasse wird über das Configuration Repository gesteuert: eine Traits-Klasse was sind Traits und Policies? Traits represent natural additional properties of a template parameter Policies represent configurable behavior for generic functions and types D. Vandevoorde and M. Josuttis C++ Templates: The Complete Guide SuS: 06.2 Produktlinien mit C++-Templates 37

38 LenList optionale Wrapper-Klasse 1 template <class BaseList> class LenList : public BaseList { // Template-Parameter wird Basisklasse public: // Ermittlung des Configuration Repository typedef typename BaseList::Config Config; private: // Ermittlung weiterer Typen aus dem Configuration Repository: typedef typename Config::ElementType ElementType; typedef typename Config::SetHeadElementType SetHeadElementType; typedef typename Config::ReturnType ReturnType; typedef typename Config::LengthType LengthType; private: // Datenelemente LengthType length_; // Anzahl der Elemente in der Liste public: // Methoden: Erweiterungen zur Verwaltung der Länge... LenList(SetHeadElementType &h, ReturnType *t=0) : BaseList(h,t), length_(computedlength()) {} void settail(returntype *t) { BaseList::setTail(t); length_ = computedlength(); } const LengthType &length() const { return length_; } LengthType computedlength() const { return tail()? tail()->length()+1 : 1; } SuS: 06.2 Produktlinien mit C++-Templates 38

39 TracedList optionaler Wrapper 2 template <class BaseList> class TracedList : public BaseList { // Template Parameter wird Basisklasse public: // Ermittlung des Configuration Repository typedef typename BaseList::Config Config; private: // Ermittlung weiteree Typen aus dem Configuration Repository: typedef typename Config::ElementType ElementType; typedef typename Config::SetHeadElementType SetHeadElementType; typedef typename Config::ReturnType ReturnType; public: // Methoden: Wrapper zur Ausgabe des Funktionsnamens TracedList(SetHeadElementType &h, ReturnType *t=0) : BaseList(h,t) {} void sethead(setheadelementtype &h) { cout << "sethead(" << h << ")" << endl; BaseList::setHead(h); } ElementType &head() { cout << "head()" << endl; return BaseList::head(); } void settail(returntype *t) { cout << "settail(t)" << endl; BaseList::setTail(t); } SuS: 06.2 Produktlinien mit C++-Templates 39

40 Konfigurierung Variante 1... erfolgt durch Anlegen eines Configuration Repository struct TracedCopyMonoPersonLenListConfig { // typedefs, die von den Komponenten benötigt werden typedef Person ElementType; typedef const ElementType SetHeadElementType; typedef int LengthType typedef ElementDestroyer<ElementType> Destroyer; typedef DynamicTypeChecker<ElementType> TypeChecker; typedef MonomorphicCopier<ElementType> Copier; // PtrList wird in LenList und TracedList verpackt typedef Weg der Konfigurationsinformationen TracedList< LenList< PtrList<TracedCopyMonoPersonLenListConfig> > > ReturnType; // und nun noch ein kürzerer Name... typedef TracedCopyMonoPersonLenListConfig::ReturnType MyList1; SuS: 06.2 Produktlinien mit C++-Templates 40

41 Konfigurierung Variante 2... oder z.b. so: struct RefPolyPersonListConfig { // typedefs, die von den Komponenten benötigt werden typedef Person ElementType; typedef ElementType SetHeadElementType; typedef EmptyDestroyer<ElementType> Destroyer; typedef EmptyTypeChecker<ElementType> TypeChecker; typedef EmptyCopier<ElementType> Copier; // PtrList wird direkt verwendet typedef PtrList<RefPolyPersonListConfig> ReturnType; // und nun noch ein kürzerer Name... typedef RefPolyPersonListConfig::ReturnType MyList2; SuS: 06.2 Produktlinien mit C++-Templates 41

42 Zwischenfazit mit Hilfe von unterschiedlichen Configuration Repositories lassen sich 24 verschiedene Listentypen erzeugen wer erstellt die Configuration Repositories? der Listen-Entwickler bei 24 Varianten gerade noch machbar, bei tausenden nicht! der Anwender der Listen Antwort: mühsam und fehlerträchtig viel Wissen über interne Strukturen nötig Konfigurierung durch den Anwender auf abstrakter Ebene mit Hilfe der Merkmale das Configuration Repository muss generiert werden; das ist die Aufgabe des Configuration Generator Template-Metaprogrammierung! SuS: 06.2 Produktlinien mit C++-Templates 42

43 Der Configuration Generator (1)... erwartet Merkmale als Eingabe: enum Ownership { ext_ref, own_ref, cp enum Morphology { mono, poly enum CounterFlag { with_counter, no_counter enum TracingFlag { with_tracing, no_tracing... basiert auf einem kleinen Hilfs-Template: template <bool cond, class ThenType, class ElseType> struct IF { typedef ThenType RET; // Spezialisierung für false template <class ThenType, class ElseType> struct IF<false, ThenType, ElseType> { typedef ElseType RET;... und wird so benutzt: ganz einfach! typedef LIST_GENERATOR<Person, ext_ref, poly>::ret MyList3; SuS: 06.2 Produktlinien mit C++-Templates 43

44 Der Configuration Generator (2) template < class ElementType_ = int, Ownership ownership = cp, Morphology morphology = mono, CounterFlag counterflag = no_counter, TracingFlag tracingflag = no_tracing, class LengthType_ = int> class LIST_GENERATOR { public: typedef LIST_GENERATOR<ElementType_, ownership,...> Generator; private: // Konfigurierungslogik wird durch IFs ausgedrückt... typedef IF<ownership==cp ownership==own_ref, ElementDestroyer<ElementType_>, EmptyDestroyer<ElementType_> >::RET Destroyer_; typedef IF<morphology==mono, DynamicTypeChecker<ElementType_>, EmptyTypeChecker<ElementType_> >::RET TypeChecker_;... typedef PtrList<Generator> List; typedef IF<counterFlag==with_counter, LenList<List>, List>::RET List_with_counter_or_not; typedef IF<tracingFlag==with_tracing, TracedList<List_with_counter_or_not>, List_with_counter_or_not>::RET List_with_tracing_or_not; // öffentliche Typen... (nächste Seite) SuS: 06.2 Produktlinien mit C++-Templates 44

45 Der Configuration Generator (3) public: // öffentliche Typen typedef List_with_tracing_or_not RET; struct Config { typedef ElementType_ ElementType; typedef SetHeadElementType_ SetHeadElementType;... typedef RET ReturnType; da Config jetzt eine generierte Klasse im Generator ist, muss die PtrList-Klasse minimal angepasst werden. template <class Generator> class PtrList { public: typedef typename Generator::Config Config; // der Rest wie gehabt SuS: 06.2 Produktlinien mit C++-Templates 45

46 Inhalt Motivation Templates für Fortgeschrittene Policy-Based Design Synthesizing Objects Zusammenfassung SuS: 06.2 Produktlinien mit C++-Templates 46

47 Zusammenfassung C++-Templates bilden das notwendige Handwerkszeug, um mit C++ generisch zu programmieren Merkmalmodelle bilden das Handwerkszeug, um Variabilität von Produktlinien zu beschreiben in Synthesizing Objects verbinden U. Eisenecker und K. Czarnecki beide Techniken Trennung der Belange durch Configuration Repositories und Configuration Generators Anwendung der Template-Metaprogrammierung und von Policy-Based Design der Ansatz erfordert, dass man die Nachteile der Programmierung mit C++-Templates in Kauf nimmt Fehlermeldungen, Übersetzungszeiten, Syntax, SuS: 06.2 Produktlinien mit C++-Templates 47

48 Literatur [1] D. Vandevoorde, N.M. Josuttis, C++ Templates: The Complete Guide. Addison-Wesley, 2003, ISBN [2] The C++ Standard BS ISO/IEC 14882:2003 (Second Edition). John Wiley & Sons, Ltd., 2003, ISBN [3] A. Alexandrescu, Modern C++ Design Generic Programming and Design Patterns Applied. Addison-Wesley, 2002, ISBN [4] K. Czarnecki und U. Eisenecker, Synthesizing Objects. Concurrency: Practice and Experience, John Wiley & Sons, Ltd SuS: 06.2 Produktlinien mit C++-Templates 48

Synthesizing Objects [1]

Synthesizing Objects [1] Betriebssystemtechnik Operating System Engineering (OSE) Synthesizing Objects [1] (U. Eisenecker und K. Czarnecki) Motivation Produktlinienkomponenten müssen wiederverwendbar sein statisch/dynamisch konfigurierbar

Mehr

Synthesizing Objects [1]

Synthesizing Objects [1] Betriebssystemtechnik Operating System Engineering (OSE) Synthesizing Objects [1] (U. Eisenecker und K. Czarnecki) Motivation Produktlinienkomponenten müssen wiederverwendbar sein statisch/dynamisch konfigurierbar

Mehr

Software ubiquitärer Systeme

Software ubiquitärer Systeme Software ubiquitärer Systeme Produktlinien mit C++-Templates Olaf Spinczyk Arbeitsgruppe Eingebettete Systemsoftware Lehrstuhl für Informatik 12 TU Dortmund Olaf.Spinczyk@tu-dortmund.de http://ess.cs.uni-dortmund.de/~os/

Mehr

Produktlinien mit C++- Templates

Produktlinien mit C++- Templates Software ubiquitärer Systeme (SuS) Produktlinien mit C++- Templates https://ess.cs.tu-dortmund.de/de/teaching/ss2018/sus/ Olaf Spinczyk olaf.spinczyk@tu-dortmund.de https://ess.cs.tu-dortmund.de/~os AG

Mehr

Software ubiquitärer Systeme

Software ubiquitärer Systeme Software ubiquitärer Systeme Produktlinien mit C++-Templates Olaf Spinczyk Arbeitsgruppe Eingebettete Systemsoftware Lehrstuhl für Informatik 12 TU Dortmund Olaf.Spinczyk@tu-dortmund.de http://ess.cs.uni-dortmund.de/~os/

Mehr

Betriebssystemtechnik. Operating System Engineering (OSE) C++ Templates

Betriebssystemtechnik. Operating System Engineering (OSE) C++ Templates Betriebssystemtechnik Operating System Engineering (OSE) C++ Templates 1 Motivation Produktlinienkomponenten müssen wiederverwendbar sein statisch/dynamisch konfigurierbar vom Anwendungsfall unabhängig

Mehr

Vortrag im Seminar Aspektorientierte Systemprogrammierung

Vortrag im Seminar Aspektorientierte Systemprogrammierung Policy-based Design Vortrag im Seminar Aspektorientierte Systemprogrammierung Von Alexander Beisig 10.5.2004 Policy-based Design 1 Übersicht Motivation Idee des Policy-based Design Beispiel: Alternative

Mehr

C++ Templates. Betriebssystemtechnik. Motivation. Warum Templates? Überblick. Operating System Engineering (OSE)

C++ Templates. Betriebssystemtechnik. Motivation. Warum Templates? Überblick. Operating System Engineering (OSE) Betriebssystemtechnik Operating System Engineering (OSE) C++ Templates Motivation Produktlinienkomponenten müssen wiederverwendbar sein statisch/dynamisch konfigurierbar vom Anwendungsfall unabhängig (generisch)

Mehr

Feature-Oriented Programming

Feature-Oriented Programming Software ubiquitärer Systeme (SuS) Feature-Oriented Programming https://ess.cs.tu-dortmund.de/de/teaching/ss2017/sus/ Olaf Spinczyk olaf.spinczyk@tu-dortmund.de https://ess.cs.tu-dortmund.de/~os AG Eingebettete

Mehr

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

DAP2-Programmierpraktikum Einführung in C++ (Teil 2) DAP2-Programmierpraktikum Einführung in C++ (Teil 2) Carsten Gutwenger 18. April 2008 Lehrstuhl 11 Algorithm Engineering Fakultät für Informatik, TU Dortmund Überblick Dynamischer Speicher Klassen und

Mehr

C++ Templates - eine kleine Einführung. Funktionstemplates. Fabian Scheler, Peter Ulbrich, Niko Böhm. 20. Oktober 2008

C++ Templates - eine kleine Einführung. Funktionstemplates. Fabian Scheler, Peter Ulbrich, Niko Böhm. 20. Oktober 2008 Überblick 1 Allgemein C++ Templates - eine kleine Einführung Fabian Scheler, Peter Ulbrich, Niko Böhm Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl Informatik 4 (Verteilte Systeme und Betriebssysteme)

Mehr

C++ Templates - eine kleine Einführung. Allgemein. Funktionstemplates. Allgemein. Funktionstemplates. Klassentemplates

C++ Templates - eine kleine Einführung. Allgemein. Funktionstemplates. Allgemein. Funktionstemplates. Klassentemplates Überblick C++ Templates - eine kleine Einführung Fabian Scheler, Peter Ulbrich, Niko Böhm Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl Informatik 4 (Verteilte Systeme und Betriebssysteme)

Mehr

Software ubiquitärer Systeme (SuS) Aspektorientierte Programmierung

Software ubiquitärer Systeme (SuS) Aspektorientierte Programmierung Software ubiquitärer Systeme (SuS) Aspektorientierte Programmierung https://ess.cs.tu-dortmund.de/de/teaching/ss2016/sus/ Horst Schirmeier, Olaf Spinczyk horst.schirmeier@tu-dortmund.de https://ess.cs.tu-dortmund.de/~hsc

Mehr

Feature-Oriented Programming [1]

Feature-Oriented Programming [1] Betriebssystemtechnik Operating System Engineering (OSE) Feature-Oriented Programming [1] (D. Batory) Motivation Software wird heute auf einem zu niedrigen Abstraktionsniveau modelliert im Zentrum der

Mehr

4. Objektorientierte Programmierung mit C++

4. Objektorientierte Programmierung mit C++ 4. Objektorientierte Programmierung mit C++ Einführung C++ / Entwicklung der Sprachfamilie Erweiterungen der Sprache C: Ein- und Ausgabe, Referenzen, Speicherallokation und Freigabe Grundlagen des Typkonzepts

Mehr

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes Verschlüsseln eines Bildes Visuelle Kryptographie Anwendung von Zufallszahlen Wir wollen ein Bild an Alice und Bob schicken, so dass Alice allein keine Information über das Bild bekommt Bob allein keine

Mehr

Programmieren in C++ Templates

Programmieren in C++ Templates Programmieren in C++ Templates Inhalt Templates Funktions- und Klassen-Templates Spezialisierung von Templates Generische Klassen Einbinden von Templates Instantiierung (implizit und explizit) Templates

Mehr

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren

Dynamische Datentypen. Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren Dynamische Datentypen Destruktor, Copy-Konstruktor, Zuweisungsoperator, Dynamischer Datentyp, Vektoren Probleme mit Feldern (variabler Länge) man kann sie nicht direkt kopieren und zuweisen Probleme mit

Mehr

Software ubiquitärer Systeme

Software ubiquitärer Systeme Software ubiquitärer Systeme Anwendungsentwicklung in C/C++ Olaf Spinczyk Arbeitsgruppe Eingebettete Systemsoftware Lehrstuhl für Informatik 12 TU Dortmund Olaf.Spinczyk@tu-dortmund.de http://ess.cs.uni-dortmund.de/~os/

Mehr

C++ Templates. Wozu Templates? Definition von Templates. Gebrauch von Templates. Instanziierung und Organisation

C++ Templates. Wozu Templates? Definition von Templates. Gebrauch von Templates. Instanziierung und Organisation C++ Templates Wozu Templates? Definition von Templates Gebrauch von Templates Instanziierung und Organisation Birgit Möller & Denis Williams AG Bioinformatik & Mustererkennung Institut für Informatik Martin-Luther-Universität

Mehr

Modernes C++ // variadic.cpp. #include <iostream> template<typename... Types> class simple_tuple; template<> class simple_tuple<> {}; Dr. K.

Modernes C++ // variadic.cpp. #include <iostream> template<typename... Types> class simple_tuple; template<> class simple_tuple<> {}; Dr. K. 10a. Variadic Templates (C++0x) // variadic.cpp #include template class simple_tuple; template class simple_tuple {}; 80 10a. Variadic Templates (C++0x) template

Mehr

Programmierkurs. Steffen Müthing. January 18, Interdisciplinary Center for Scientific Computing, Heidelberg University

Programmierkurs. Steffen Müthing. January 18, Interdisciplinary Center for Scientific Computing, Heidelberg University Programmierkurs Steffen Müthing Interdisciplinary Center for Scientific Computing, Heidelberg University January 18, 2019 Konzepte Standard-Konzepte für Code Reuse: Polymorphie/Vererbung Funktionalität

Mehr

Impact of Economics on Compiler Optimization

Impact of Economics on Compiler Optimization Impact of Economics on Compiler Optimization Arch D. Robinson Kai Software Seminar Zwischensprachen & Codegenerierung IPD Goos Dimitar Dimitrov Betreuer Rubino Geiß 0 Überblick Überblick Problem Übersetzer

Mehr

Praxis der Programmierung

Praxis der Programmierung Liste, Ausnahmefehler, Template-Funktionen und -Klassen Institut für Informatik und Computational Science Henning Bordihn 1 Stack als einfach verkettete Liste 2 Aufgabe 1 1. Kopieren Sie aus /home/rlehre/w13

Mehr

5. Behälter und Iteratoren. Programmieren in C++ Überblick. 5.1 Einleitung. Programmieren in C++ Überblick: 5. Behälter und Iteratoren

5. Behälter und Iteratoren. Programmieren in C++ Überblick. 5.1 Einleitung. Programmieren in C++ Überblick: 5. Behälter und Iteratoren Programmieren in C++ Überblick 1. Einführung und Überblick 2. Klassen und Objekte: Datenkapselung 3. Erzeugung und Vernichtung von Objekten 4. Ad-hoc Polymorphismus 6. Templates und generische Programmierung

Mehr

Programmieren in C++ Überblick

Programmieren in C++ Überblick Programmieren in C++ Überblick 1. Einführung und Überblick 2. Klassen und Objekte: Datenkapselung 3. Erzeugung und Vernichtung von Objekten 4. Ad-hoc Polymorphismus 6. Templates und generische Programmierung

Mehr

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz Patrick Schulz patrick.schulz@paec-media.de 29.04.2013 1 Einführung Einführung 2 3 4 Quellen 1 Einführung Einführung 2 3 4 Quellen Hello World in Java Einführung 1 public class hello_ world 2 { 3 public

Mehr

Einführung in die Systemprogrammierung

Einführung in die Systemprogrammierung Einführung in die Systemprogrammierung Virtuelle Methodentabellen Prof. Dr. Christoph Reichenbach Fachbereich 12 / Institut für Informatik 9. Juli 2015 Struktur der Objektorientierung Ein wenig Java: public

Mehr

Die Anwesenheitspflicht beim Seminar gilt für diejenigen Teilnehmer, die einen Schein erwerben wollen. Für die Nachmittagsübungen gilt keine

Die Anwesenheitspflicht beim Seminar gilt für diejenigen Teilnehmer, die einen Schein erwerben wollen. Für die Nachmittagsübungen gilt keine 1 2 Die Anwesenheitspflicht beim Seminar gilt für diejenigen Teilnehmer, die einen Schein erwerben wollen. Für die Nachmittagsübungen gilt keine Anwesenheitspflicht; d.h. die Teilnehmer dürfen sie gerne

Mehr

Programmieren 2 C++ Überblick

Programmieren 2 C++ Überblick Programmieren 2 C++ Überblick 1. Einführung und Überblick 2. Klassen und Objekte: Datenkapselung 3. Erzeugung und Vernichtung von Objekten 4. Ad-hoc Polymorphismus 6. Templates und generische Programmierung

Mehr

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017 Mapra: C++ Teil 6 Felix Gruber, Sven Groß IGPM, RWTH Aachen 13. Juni 2017 Felix Gruber, Sven Groß (IGPM, RWTH Aachen) Mapra: C++ Teil 6 13. Juni 2017 1 / 22 Was bisher geschah Klassen I Attribute und Methoden

Mehr

Objektorientierte Programmierung II

Objektorientierte Programmierung II Objektorientierte Programmierung II OOP I Erlaubt Entwicklers, im Problemraum zu denken und zu arbeiten. Das Problem wird in eine Menge von Objekten zerlegt. Objekte wirken aufeinander, um das Problem

Mehr

Repetitorium Programmieren I + II

Repetitorium Programmieren I + II Repetitorium Programmieren I + II Stephan Gimbel Johanna Mensik Michael Roth 6. März 2012 Agenda 1 Operatoren 2 Datentypen Gleitpunkt Zahl Typkonvertierung 3 Strommanipulatoren 4 Bedingungen if-else switch-case

Mehr

Visuelle Kryptographie. Anwendung von Zufallszahlen

Visuelle Kryptographie. Anwendung von Zufallszahlen Visuelle Kryptographie Anwendung von Zufallszahlen Verschlüsseln eines Bildes Wir wollen ein Bild an Alice und Bob schicken, so dass Verschlüsseln eines Bildes Wir wollen ein Bild an Alice und Bob schicken,

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1 Kapitel 11 Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 2 Ziele Implementierungen für

Mehr

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11 C++ Teil 12 Sven Groß 18. Jan 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 12 18. Jan 2016 1 / 11 Themen der letzten Vorlesung Wiederholung aller bisherigen Themen: Datentypen und Variablen Operatoren Kontrollstrukturen

Mehr

Informatik. Strukturen und Aufzählungstypen. Vorlesung

Informatik. Strukturen und Aufzählungstypen. Vorlesung Informatik Vorlesung 06 Strukturen und Aufzählungstypen 03. Dezember 2018 WiSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1 Datentypen Die bisher benutzten Datentypen waren

Mehr

Abend 7 Vererbung und Polymorphie, Abstrakte Klassen

Abend 7 Vererbung und Polymorphie, Abstrakte Klassen Abend 7 Vererbung und Polymorphie, Abstrakte Klassen Ziel, Inhalt Wir sehen heute weitere Beispiele für Polymorphie und virtuelle Methoden. Wir lernen auch Klassen kennen, von denen man keine Objekte erzeugen

Mehr

Vorlesung Datenstrukturen

Vorlesung Datenstrukturen Vorlesung Datenstrukturen Objektorientierung in C++ (3) Aspekte der Vererbung (1) Dr. Frank Seifert Vorlesung Datenstrukturen - Sommersemester 2016 Folie 546 Zuweisung bei Vererbung Dr. Frank Seifert Vorlesung

Mehr

Informatik - Übungsstunde

Informatik - Übungsstunde Informatik - Übungsstunde Jonas Lauener (jlauener@student.ethz.ch) ETH Zürich Woche 12-23.05.2018 Lernziele Klassen Dynamic Memory Jonas Lauener (ETH Zürich) Informatik - Übung Woche 12 2 / 20 Structs

Mehr

Generative Programmierung

Generative Programmierung 1/100 Generative Programmierung Andreas Zeller Lehrstuhl Softwaretechnik Universität des Saarlandes, Saarbrücken Grundidee: Parametrisierung 2/100 Die Abstraktion ist ein weiteres Grundprinzip der Softwaretechnik.

Mehr

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

C++ Notnagel. Ziel, Inhalt. Programmieren in C++ C++ Notnagel Ziel, Inhalt Ich versuche in diesem Dokument noch einmal die Dinge zu erwähnen, die mir als absolut notwendig für den C++ Unterricht und die Prüfungen erscheinen. C++ Notnagel 1 Ziel, Inhalt

Mehr

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 2. Teil

Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++, 2. Teil MÜNSTER Übung zur Vorlesung Wissenschaftliches Rechnen Sommersemester 2012 Auffrischung zur Programmierung in C++ 2. Teil 18. April 2012 Organisatorisches MÜNSTER Übung zur Vorlesung Wissenschaftliches

Mehr

C++ Templates - eine kleine Einführung

C++ Templates - eine kleine Einführung C++ Templates - eine kleine Einführung Peter Ulbrich, Martin Hoffmann Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl Informatik 4 (Verteilte Systeme und Betriebssysteme) www4.informatik.uni-erlangen.de

Mehr

Das Interface-Konzept am Beispiel der Sprache Java

Das Interface-Konzept am Beispiel der Sprache Java Das Interface-Konzept am Beispiel der Sprache Java Klaus Kusche, November 2013 Inhalt Motivation: Wozu braucht man Interfaces? Interfaces in Java Was spricht gegen die große Lösung? Voraussetzungen Kenntnisse

Mehr

Advanced Programming in C

Advanced Programming in C Advanced Programming in C Pointer und Listen Institut für Numerische Simulation Rheinische Friedrich-Wilhelms-Universität Bonn Oktober 2013 Überblick 1 Variablen vs. Pointer - Statischer und dynamischer

Mehr

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17 C++ Teil 9 Sven Groß 17. Juni 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 9 17. Juni 2016 1 / 17 Themen der letzten Vorlesung Objektorientierung und Klassen Attribute / Datenelemente Methoden / Elementfunktionen

Mehr

Programmierkurs C++ Templates & STL (1/2)

Programmierkurs C++ Templates & STL (1/2) Programmierkurs C++ Templates & STL (1/2) Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck https://www.itm.uni-luebeck.de/people/fischer #2 Templates Die wichtigsten objekt-orientierten

Mehr

C/C++-Programmierung

C/C++-Programmierung 1 C/C++-Programmierung Speicherverwaltung, 0, const Sebastian Hack Christoph Mallon (hack mallon)@cs.uni-sb.de Fachbereich Informatik Universität des Saarlandes Wintersemester 2009/2010 2 Speicherverwaltung

Mehr

Generative Programmierung

Generative Programmierung Generative Programmierung Andreas Zeller Lehrstuhl für Softwaretechnik Universität des Saarlandes, Saarbrücken 2005-01-12 Grundidee: Parametrisierung Die Abstraktion ist ein Grundprinzip der Softwaretechnik.

Mehr

Grundlagen Polymorphismus Eigenschaften virtueller Klassen Mehrfachvererbung bei ROOT. Mehrfache Vererbung. Daniel Beneckenstein. 21.

Grundlagen Polymorphismus Eigenschaften virtueller Klassen Mehrfachvererbung bei ROOT. Mehrfache Vererbung. Daniel Beneckenstein. 21. Mehrfache Vererbung Daniel Beneckenstein 21. August 2006 Mehrfache Vererbung Ableitung einer Klasse von beliebig vielen Basisklassen: class A {... }; class B {... }; class C {... }; class D: public A,

Mehr

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen Algorithmen und Datenstrukturen Dynamische Datenobjekte Pointer/Zeiger, Verkettete Liste Eigene Typdefinitionen 1 Zeigeroperatoren & und * Ein Zeiger ist die Speicheradresse irgendeines Objektes. Eine

Mehr

Programmierkurs C/C++

Programmierkurs C/C++ Blockkurs: "Einführung in C/C++" Programmierkurs C/C++ Donnerstag Sandro Andreotti andreott@inf.fu-berlin.de WS 2008/09 1 Structs Blockkurs: "Einführung in C/C++" 2 Structs sind Bündel von Variablen (unter

Mehr

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14

C++ Teil 6. Sven Groß. 27. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 14 C++ Teil 6 Sven Groß 27. Mai 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 6 27. Mai 2016 1 / 14 Themen der letzten Vorlesung Musterlösung A2 Wdh.: Zeiger und Felder Kopieren von Feldern Dynamische Speicherverwaltung

Mehr

variadic templates Templates mit variabler Argumentanzahl?

variadic templates Templates mit variabler Argumentanzahl? Templates mit variabler Argumentanzahl? bislang in C++98 nicht direkt möglich, stattdessen (geniale Idee von A. Alexandrescu): Typlisten template struct Typelist {!typedef T Head;!typedef

Mehr

Zusammenfassung. Mit bjam und ein paar Zeilen in einem Jamroot oder Jamfile lässt sich das Kompilieren und Linken einfach automatisieren

Zusammenfassung. Mit bjam und ein paar Zeilen in einem Jamroot oder Jamfile lässt sich das Kompilieren und Linken einfach automatisieren Zusammenfassung Deklaration einer Klasse im Header-File /.h-file Header-Files mit #pragma once vor double inclusion schützen möglichst Vorwärts-Deklarationen verwenden statt include-files einzubinden mindestens

Mehr

Repetitorium Programmieren I + II

Repetitorium Programmieren I + II Repetitorium Programmieren I + II Stephan Gimbel Johanna Mensik Michael Roth 24. September 2012 Agenda 1 Funktionen Aufbau und Anwendung Call by Value Call by Reference Überladen von Funktionen Default

Mehr

12 Abstrakte Klassen, finale Klassen und Interfaces

12 Abstrakte Klassen, finale Klassen und Interfaces 12 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,

Mehr

Mapra: C++ Teil 4. Felix Gruber. 6. Mai IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6.

Mapra: C++ Teil 4. Felix Gruber. 6. Mai IGPM, RWTH Aachen. Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6. Mapra: C++ Teil 4 Felix Gruber IGPM, RWTH Aachen 6. Mai 2015 Felix Gruber (IGPM, RWTH Aachen) Mapra: C++ Teil 4 6. Mai 2015 1 / 22 Themen vom letzten Mal Kompilieren mit Makefiles Ein-/Ausgabe über Dateien

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1 Kapitel 13 Listen Listen 1 Ziele Implementierungen für Listen kennenlernen Einfach verkettete und doppelt verkettete Listen verstehen Listen-Implementierungen in der Java-Bibliothek kennenlernen Durch

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1 Kapitel 12 Listen Listen 1 Ziele Implementierungen für Listen kennenlernen Einfach verkettete und doppelt verkettete Listen verstehen Listen-Implementierungen in der Java-Bibliothek kennenlernen Durch

Mehr

Ein kleiner Blick auf die generische Programmierung

Ein kleiner Blick auf die generische Programmierung TgZero Technik.Blosbasis.net June 3, 2013 1 Inhaltsverzeichnis 1 Vorwort 3 2 Ein kleines Beispiel 3 3 Templates 3 4 Verschiedene Datentypen 4 5 Variadic Templates 5 6 Unterschied zwischen den Programmiersprachen

Mehr

C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14

C++ Teil 10. Sven Groß. 17. Dez IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Dez / 14 C++ Teil 10 Sven Groß IGPM, RWTH Aachen 17. Dez 2014 Sven Groß (IGPM, RWTH Aachen) C++ Teil 10 17. Dez 2014 1 / 14 Themen der letzten Vorlesung Objektorientierung und Klassen Attribute / Datenelemente

Mehr

Betriebssysteme, Rechnernetze und verteilte Systeme 1. Crashkurs C (2)

Betriebssysteme, Rechnernetze und verteilte Systeme 1. Crashkurs C (2) Betriebssysteme, Rechnernetze und verteilte Systeme 1 Crashkurs C (2) Olaf Spinczyk Arbeitsgruppe Eingebettete Systemsoftware Lehrstuhl für Informatik 12 TU Dortmund olaf.spinczyk@tu-dortmund.de http://ess.cs.uni-dortmund.de/teaching/ss2008/bsrvs1/

Mehr

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes Variablen Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes v ist Stück im Speicher, der 4 Bytes lang ist Speicherzugriff? Über Adressen!

Mehr

1 Maschinenunabhängige Optimierungen. Maschinenunabhängige Optimierungen Wintersemester 2008/09 1 / 17

1 Maschinenunabhängige Optimierungen. Maschinenunabhängige Optimierungen Wintersemester 2008/09 1 / 17 1 Maschinenunabhängige Optimierungen Maschinenunabhängige Optimierungen Wintersemester 2008/09 1 / 17 Optimierungen Automatische Optimierungen sind nötig, weil unoptimierter Code meist besser lesbar ist.

Mehr

Objektorientierung. Klassen und Objekte. Dr. Beatrice Amrhein

Objektorientierung. Klassen und Objekte. Dr. Beatrice Amrhein Objektorientierung Klassen und Objekte Dr. Beatrice Amrhein Überblick Konzepte der Objektorientierten Programmierung Klassen und Objekte o Implementierung von Klassen o Verwendung von Objekten 2 Konzepte

Mehr

Programmierkurs. SoSe Markus Geveler Inst. f. Applied Mathematics, TU Dortmund.

Programmierkurs. SoSe Markus Geveler Inst. f. Applied Mathematics, TU Dortmund. Programmierkurs SoSe 2013 Markus Geveler Inst. f. Applied Mathematics, TU Dortmund markus.geveler@math.tu-dortmund.de Lesson 5 Was machen wir heute hier? weiter mit Objektorientierter Programmierung viel

Mehr

C++ - Objektorientierte Programmierung Polymorphie

C++ - Objektorientierte Programmierung Polymorphie C++ - Objektorientierte Programmierung Polymorphie hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen C++ - Objektorientierte Programmierung 21.06.16 Seite 1 Polymorphie

Mehr

Grundlagen der Informatik

Grundlagen der Informatik Grundlagen der Informatik Klausur 1. August 2008 1. Dynamische Datenstrukturen und objektorientierte Programmierung (45 Punkte) Gegeben sei eine Datenstruktur mit folgendem Aufbau struct lelem { int w;

Mehr

C++ - Objektorientierte Programmierung Konstante und statische Elemente

C++ - Objektorientierte Programmierung Konstante und statische Elemente C++ - Objektorientierte Programmierung Konstante und statische Elemente hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen Leibniz Universität IT Services Anja

Mehr

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter}); S. d. I.: Programieren in C Folie 7-1 7 Funktionen 7.1 Definition Prototyp-Syntax: Speicherklasse Typ Name (formale Parameter); der Funktions-Prototyp deklariert eine Funktion, d.h. er enthält noch nicht

Mehr

Programmieren II Abstrakte Klassen / Virtuelle Methoden. Programmieren II Abstrakte Klassen / Virtuelle Methoden

Programmieren II Abstrakte Klassen / Virtuelle Methoden. Programmieren II Abstrakte Klassen / Virtuelle Methoden Einleitende Bemerkungen Einleitende Bemerkungen Aspekte Aufbau von sinnvollen Klassenhierarchien Verwaltung von Objekten unterschiedlichen Typs Mitarbeiter Besonderheiten der Anwendung jeder Angehörige

Mehr

Programmierkurs C/C++

Programmierkurs C/C++ Blockkurs: "Einführung in C/C++" Programmierkurs C/C++ Freitag Sandro Andreotti andreott@inf.fu-berlin.de WS 2008/09 1 Blockkurs: "Einführung in C/C++" 2 Vererbung Klassen erben die Member von Basisklassen:

Mehr

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13

C++ Teil 7. Sven Groß. 30. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 13 C++ Teil 7 Sven Groß 30. Nov 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 7 30. Nov 2015 1 / 13 Themen der letzten Vorlesung Zeiger, Felder (Wdh.) dynamische Speicherverwaltung Sven Groß (IGPM, RWTH Aachen)

Mehr

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung)

Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) Wintersemester 2005/06 Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich Informatik Lehrstuhl

Mehr

Einführung in C# Teil 1. Matthias Nübling

Einführung in C# Teil 1. Matthias Nübling Einführung in C# Teil 1 Matthias Nübling Vorausgesetzte Grundkenntnisse Programmierung Typen, Variablen, Anweisungen, Funktionen, etc. Objektorientierte Programmierung Klassen, Vererbung, Polymorphismus,

Mehr

4. Objektorientierte Programmierung mit C++

4. Objektorientierte Programmierung mit C++ 4. Objektorientierte Programmierung mit C++ Einführung C++ / Entwicklung der Sprachfamilie Erweiterungen der Sprache C: Ein- und Ausgabe, Referenzen, Speicherallokation und Freigabe Grundlagen des Typkonzepts

Mehr

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren hat eine Kantenlänge hat eine Füllfarbe Kantenlänge setzen Füllfarbe lesen Volumen berechnen Leibniz Universität IT Services Anja Aue

Mehr

1 Abstrakte Klassen, finale Klassen und Interfaces

1 Abstrakte Klassen, finale Klassen und Interfaces 1 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,

Mehr

Informatik I (D-MAVT)

Informatik I (D-MAVT) Informatik I (D-MAVT) Übungsstunde 7 simon.mayer@inf.ethz.ch Distributed Systems Group, ETH Zürich Ablauf Nachbesprechung Übung 5 Besprechung/Vertiefung der Vorlesung Vorbesprechung Übung 7 Aufgabe 1:

Mehr

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18

C++ Teil 5. Sven Groß. 13. Mai Sven Groß (IGPM, RWTH Aachen) C++ Teil Mai / 18 C++ Teil 5 Sven Groß 13. Mai 2016 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 13. Mai 2016 1 / 18 Themen der letzten Vorlesung Funktionen Funktionsüberladung, Signatur Rekursion const-deklaration Referenzen

Mehr

Name: Klausur Informatik III WS 2003/04

Name: Klausur Informatik III WS 2003/04 1 : Methodenimplementierung ca. 42 Punkte Gegeben ist die Klasse Mitarbeiter. Listing 1: (./Code1/Mitarbeiter.h) using namespace std; // globale Variable fuer Ausgabedatei // kann entsprechend

Mehr

Objektorientierte Programmierung

Objektorientierte Programmierung C++ Objektorientierte Programmierung Erweiterung von selbstdefinierten Datentypen (struct) zu Klasse. Eine Klasse besteht dann aus - Attributen (Untertypen wie struct) und zusätzlich - aus Methoden (Funktionen

Mehr

Tag 8 Repetitorium Informatik (Java)

Tag 8 Repetitorium Informatik (Java) Tag 8 Repetitorium Informatik (Java) Dozent: Michael Baer Lehrstuhl für Informatik 2 (Programmiersysteme) Friedrich-Alexander-Universität Erlangen-Nürnberg Wintersemester 2017/2018 Informatik-Repetitorium

Mehr

Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen

Lambda-Funktionen. Lambda-Funktionen. Lambda-Funktionen sollen Lambda-Funktionen Lambda-Funktionen sind Funktionen ohne Namen. definieren ihre Funktionalität an Ort und Stelle. können wie Daten kopiert werden. können ihren Aufrufkontext speichern. Lambda-Funktionen

Mehr

Problem: Vererbung erlaubt die Wiederverwendung d von Programmcode, virtuelle Funktionen ermöglichen dabei den Austausch gewisser Funktionalität

Problem: Vererbung erlaubt die Wiederverwendung d von Programmcode, virtuelle Funktionen ermöglichen dabei den Austausch gewisser Funktionalität Problem: Vererbung erlaubt die Wiederverwendung d von Programmcode, virtuelle Funktionen ermöglichen dabei den Austausch gewisser Funktionalität Vererbung erlaubt NICHT die Wiederverwendung durch Parametrisierung

Mehr

Implementieren von Klassen

Implementieren von Klassen Implementieren von Klassen Felder, Methoden, Konstanten Dr. Beatrice Amrhein Überblick Felder/Mitglieder (Field, Member, Member-Variable) o Modifizierer Konstanten Methoden o Modifizierer 2 Felder und

Mehr

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1 Informatik Vorlesung 08 Pointer (Dynamisch) 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1 Pointer (Zeiger) Dynam. Speicher Bisher: Speicherbedarf muss

Mehr

Kapitel 13. Definition von Klassen. OOP Thomas Klinker 1

Kapitel 13. Definition von Klassen. OOP Thomas Klinker 1 Kapitel 13 Definition von Klassen OOP Thomas Klinker 1 OOP Thomas Klinker 2 Datenabstraktion Der Mensch abstrahiert, um komplexe Sachverhalte darzustellen. Dinge und Vorgänge werden auf das wesentliche

Mehr

Angewandte Mathematik und Programmierung

Angewandte Mathematik und Programmierung Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu mathematischen Rechnens WS 2013/14 Operatoren Operatoren führen Aktionen mit Operanden aus. Der

Mehr

einlesen n > 0? Ausgabe Negative Zahl

einlesen n > 0? Ausgabe Negative Zahl 1 Lösungen Kapitel 1 Aufgabe 1.1: Nassi-Shneiderman-Diagramm quadratzahlen Vervollständigen Sie das unten angegebene Nassi-Shneiderman-Diagramm für ein Programm, welches in einer (äußeren) Schleife Integer-Zahlen

Mehr

Die abstrakte Klasse Expression:

Die abstrakte Klasse Expression: Die abstrakte Klasse Expression: Expression abstract evaluate() Add Neg Const 501 Die abstrakte Klasse Expression: Expression abstract evaluate() Add Neg Const Leider (zum Glück?) lässt sich nicht die

Mehr

Praxis der Programmierung

Praxis der Programmierung Dynamische Datentypen Institut für Informatik und Computational Science Universität Potsdam Henning Bordihn Einige Folien gehen auf A. Terzibaschian zurück. 1 Dynamische Datentypen 2 Dynamische Datentypen

Mehr

Einführung in die Programmierung mit C++

Einführung in die Programmierung mit C++ 1 Seite 1 Einführung in die Programmierung mit C++ Teil III - Objektorientierte Programmierung 9. Klassen und Methoden Was sind Klassen? Seite 2 sprachliches Mittel von C++ um objektorientierte Programmierung

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 35 Einstieg in die Informatik mit Java Vererbung Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 35 1 Grundlagen 2 Verdeckte Variablen 3 Verdeckte Methoden 4 Konstruktoren

Mehr

Vererbung und Polymorphie

Vererbung und Polymorphie page1 Vererbung und Polymorphie Florian Adamsky, B Sc florianadamsky@iemthmde http://florianadamskyit/ cbd So wareentwicklung im SS 2014 page2 Outline 1 Ein ührung 2 Vererbung Formen der Vererbung 3 Polymorphie

Mehr

Lösung der OOP-Prüfung WS12/13

Lösung der OOP-Prüfung WS12/13 2.1.2013 Lösung der OOP-Prüfung WS12/13 1. Aufgabe a) Da der Konstruktor im protected-bereich steht, können keine eigenständigen Objekte der Klasse angelegt werden. Durch den protected-konstruktor wird

Mehr