Produktlinien mit C++-Templates
|
|
- Stefan Breiner
- vor 5 Jahren
- Abrufe
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]
Betriebssystemtechnik Operating System Engineering (OSE) Synthesizing Objects [1] (U. Eisenecker und K. Czarnecki) Motivation Produktlinienkomponenten müssen wiederverwendbar sein statisch/dynamisch konfigurierbar
MehrSynthesizing Objects [1]
Betriebssystemtechnik Operating System Engineering (OSE) Synthesizing Objects [1] (U. Eisenecker und K. Czarnecki) Motivation Produktlinienkomponenten müssen wiederverwendbar sein statisch/dynamisch konfigurierbar
MehrSoftware 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/
MehrProduktlinien 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
MehrSoftware 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/
MehrBetriebssystemtechnik. 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
MehrVortrag 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
MehrC++ 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)
MehrFeature-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
MehrDAP2-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
MehrC++ 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)
MehrC++ 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)
MehrSoftware 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
MehrFeature-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
Mehr4. 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
MehrVerschlü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
MehrProgrammieren 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
MehrDynamische 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
MehrSoftware 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/
MehrC++ 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
MehrModernes 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
MehrProgrammierkurs. 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
MehrImpact 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
MehrPraxis 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
Mehr5. 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
MehrProgrammieren 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
MehrEinfü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
MehrEinfü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
MehrDie 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
MehrProgrammieren 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
MehrMapra: 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
MehrObjektorientierte 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
MehrRepetitorium 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
MehrVisuelle 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,
MehrEinfü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
MehrC++ 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
MehrInformatik. 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
MehrAbend 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
MehrVorlesung 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
MehrInformatik - Ü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
MehrGenerative 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.
MehrC++ 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
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
MehrC++ 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
MehrDas 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
MehrAdvanced 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
MehrC++ 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
MehrProgrammierkurs 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
MehrC/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
MehrGenerative 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.
MehrGrundlagen 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,
MehrAlgorithmen und Datenstrukturen
Algorithmen und Datenstrukturen Dynamische Datenobjekte Pointer/Zeiger, Verkettete Liste Eigene Typdefinitionen 1 Zeigeroperatoren & und * Ein Zeiger ist die Speicheradresse irgendeines Objektes. Eine
MehrProgrammierkurs 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
MehrC++ 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
Mehrvariadic 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
MehrZusammenfassung. 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
MehrRepetitorium 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
Mehr12 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,
MehrMapra: 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
MehrEinfü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
MehrEinfü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
MehrEin 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
MehrC++ 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
MehrBetriebssysteme, 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/
MehrVariablen. 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!
Mehr1 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.
MehrObjektorientierung. 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
MehrProgrammierkurs. 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
MehrC++ - 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
MehrGrundlagen 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;
MehrC++ - 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
Mehr7 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
MehrProgrammieren 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
MehrProgrammierkurs 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:
MehrC++ 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)
MehrEinfü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
MehrEinfü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,
Mehr4. 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
MehrC++ - 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
Mehr1 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,
MehrInformatik 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:
MehrC++ 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
MehrName: 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
MehrObjektorientierte 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
MehrTag 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
MehrLambda-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
MehrProblem: 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
MehrImplementieren 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
MehrInformatik. 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
MehrKapitel 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
MehrAngewandte 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
Mehreinlesen 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
MehrDie 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
MehrPraxis 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
MehrEinfü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
MehrEinstieg 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
MehrVererbung 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
MehrLö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