Aspekt-Orientierte Programmierung mit C++
|
|
- Hannelore Frank
- vor 7 Jahren
- Abrufe
Transkript
1 Aspekt-Orientierte Programmierung mit C++ Georg Blaschke Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl für Betriebssysteme und Verteilte Systeme 17. Juni 2003 Um aspekt-orientierte Programmierung zu betreiben, ist es nicht unbedingt nötig spezielle Compiler einzusetzen oder den fachlichen Code mit dem Aspektcode vor der Übersetung mit Hilfe eines zusätzlichen Programms zusammenzuführen. Mit einem herkömmlichen C++ Compiler (GNU,VCC) ist es möglich, AOP in einem Projekt zu verwenden. 1 Einleitung und Motivation Dieses Dokument beruht zum größten Teil auf einen dreiteiligen Bericht in der Zeitschrift ix[1], der eine Untersuchung der Programmiersprache C++ hinsichtlich ihrer Eignung für aspekt-orientiertes Programmieren beschreibt. Als Rahmenbedingungen gelten, dass aspekt-orientierter Code in Standard- C++ geschrieben ist, ohne zusätzliche Software (wie z.b. ein Präprozessor) auskommt, auf existierenden Quellcode anwendbar ist und sich mit GNU C bzw. V übersetzen läßt. Ausserdem soll der vorhandene Quellcode möglichst keinen Änderungen unterworfen sein. Anhand von Beispielen werden nun einige Möglichkeiten aufgezeigt, Aspektcode mit fachlichen Code zu verküpfen. Dieser gewobene Code findet dann seine Anwendung im Clientcode, also in einer konkreten Anwendung. Abbildung 1 verdeutlicht die Benutzt-Beziehung zwischen den verschiedenen Arten von Code. Aspektcode <<benutzt>> fachlicher Code <<benutzt>> gewobener Code <<benutzt>> Clientcode Abbildung 1: Beziehung zwischen verschiedenen Code-Arten 2 Basistechniken Anhand der einfachen Implementierung eines Stacks (Listing 1) werden verschiedene Methoden erläutert, den Tracing-Aspekt auf eine C++-Klasse anzuwenden. class IntStack IntStack() : size (0) void push(const int& i) elements [ size ++] = i; Listing 1: IntStack 1
2 ; int pop() return elements [ size ]; private: enum max size = 3 ; int elements [ max size ]; int size ; 2.1 Manipulation der Quellcodes Die wohl simpelste Lösung, Aspekte auf Fachcode anzuwenden, ist, den Aspektcode direkt in den Fachcode hineinzuschreiben. Zu diesem Zweck wird eine Helferklasse implementiert, deren Konstruktor und Destruktor den Text Before bzw. After und den Übergedenen Funktionsnamen ausgeben. Der Grund, weswegen für eine Zeichenaugabe eine ganze Klasse implementiert wird, liegt darin, dass es in C/C++ nicht möglich ist, Code anzugeben, der nach der Beendigung einer Funktion ausgeführt werden soll. Durch die Verwendung der Helferklasse ReportTracing wird jedoch genau dies erreicht, da die Instanz der Klasse erst nach Ausführung des Funktionsrumpfes zerstört wird, somit also auch ihr Destruktor mit Tracing-Textausgabe ausgeführt wird. Listing 2: Report Tracing class ReportTracing // Hilfsklasse zur Implementierung des Tracing Aspekts ReportTracing(const char function): function ( function ) cout << Before << function << endl; ReportTracing() cout << After << function << endl; private: const char function ; ; class IntStack IntStack() : size (0) ReportTracing t( constructor ); void push(const int& i) elements [ size ++] = i; return; int pop() return elements [ size ]; private: enum max size = 3 ; int elements [ max size ]; int size ; ; 2
3 Der grobe Eingriff in den Quellcode verstößt natürlich gegen eine der Voraussetzung, und hat eigentlich nichts mit AOP zu tun, da der Aspekt nicht zentral gekapselt ist, sondern in an mehreren Stellen den fachspezifischen Code durchzieht. Dies ist in Listing 1 durch einen Unterstrich gekennzeichnet. 2.2 Komposition mit Weiterleitung Um einen Aspekt seperat vom Fachcode zu implementieren, kann man dessen Code in eine eigene Klasse schreiben, die alle Member-Funktionen der Fachklasse implementiert und den Aufruf an die jeweilige Methode der Fachklasse weiterleitet. class IntStackWithTracing IntStackWithTracing() ReportTracing t( constructor ); mystack = new IntStack(); void push(const int& i) mystack >push(i); int pop() return mystack >pop(); private: IntStack mystack; ; Listing 3: Komposition mit Weiterleitung Die Komposition von Fach- und Aspektcode unter Verwendung von Funktionsaufruf-Weiterleitung hat den Nachteil, dass alle Methoden der Fachklasse implementiert werden müssen. Ausserdem muss der Programmierer jedesmal wenn eine neue Funktion dem Fachcode hinzugefügt wird, auch den Aspektcode entsprechend erweitern. 2.3 Komposition mit Vererbung Um den Nachteilen zu begegnen, die durch Verwendung von Weiterleitung der Funktionsaufrufe entstehen, wird nun Vererbung eingesetzt. Somit kann die Fachklasse nach Belieben erweitert werden und die Aspektklasse muss nicht alle Methoden von ihr implementieren. class IntStackWithTracing: public IntStack IntStackWithTracing() ReportTracing t( constructor ); void push(const int& i) IntStack :: push(i); int pop() Listing 4: Komposition mit Vererbung 3
4 ; return IntStack :: pop(); Der Nachteil dieser Art der Komposition ist, dass es nicht ohne weiteren Aufwand möglich ist Code zu spezifizieren der vor einem Konstruktor ausgeführt wird. Bei der Instanziierung der Klasse IntStackWithTracing aus Listing 4 wird die Ausgabe Before constructor erst erscheinen, wenn der Konstruktor der Eltern-Klasse (hier: IntStack) abgearbeitet ist. Eine Lösung zu diesem Problem wird später noch vorgestellt. 2.4 Verwendung von Namesräumen Um Aspekte anzuwenden musste bisher der Clientcode so angepasst werden, dass er die Klasse instanziiert, die genau diesen Aspekt implementiert; z.b IntStackWithTracing. Diese Verfahrensweise widerspricht jedoch der Voraussetzung, dass kein Quellcode verändert werden darf, also auch nicht der Code der Anwendung. Um den Clientcode nicht ändern zu müssen, muss die Aspektklasse den selben Namen besitzten wie die Fachklasse, wodurch jedoch ein Namenskonflikt auftritt. Gelöst wird dieser Konflikt indem geringfügige Änderungen am Fachcode zugelassen werden, so dass dieser in einem eigenen Namensraum (namespace original) definiert ist. Aspektklassen und dazugehörige Helferklassen befinden analog im namespace aspects. Der Clientcode importiert mittels using namespace composed den Namensraum, in dem die Klasse IntStack definiert ist; entweder mit Aspekten oder ohne. Um einen Aspekt mit hinzuzunehmen, oder wegzulassen, muss man nur im Namensraum composed den Typ IntStack entsprechend definieren. namespace original namespace aspects //Klasse Report Tracing wie in Listing 2 typedef original :: IntStack IntStack ; class IntStackWithTracing: public IntStack IntStackWithTracing() ReportTracing t( constructor ); void push(const int& i) IntStack :: push(i); int pop() return IntStack :: pop(); ; Listing 5: Verwendung von Namensräumen namespace composed // typedef aspects :: IntStack IntStack ; // pure IntStack // typedef aspects :: IntStackWithChecking Stack; // IntStack with Checking (not shown here) typedef aspects :: IntStackWithTracing IntStack ; // Stack with Tracing 4
5 3 Zwischenstand Die Techniken die bisher gezeigt wurden (Helferklasse, Vererbung, Namensräume) ermöglichen es, einzelne Aspekte auf Klassen (und auch Klassentemplates) anzuwenden. Der momentane Stand erlaubt jedoch noch nicht Aspekte mit mehrere Klassen oder mehrere Aspekte mit einer Klasse zu verküpfen. Ausserdem stellt sich noch die Frage wie man Aspektcode angibt, der vor einem Konstruktor oder nach einem Destruktor ausgeführt werden soll. Techniken für die angesprochnen Probleme werden im Folgenden vorgestellt. 4 Techniken zur Lösung spezieller Probleme 4.1 Ausführung von Code vor einem Konstruktor oder nach einem Destruktor Bei der Kompostition mit Vererbung (siehe Kapitel 2.3) hat man die Einschränkung, keinen Code spezifizieren zu können, der vor dem Konstruktor oder nach dem Destruktor der Fachklasse ausgeführt werden soll. Um diese Limitierung zu beseitigen, werden zwei weitere Hilfsklassen BeforeConstructor und AfterConstructor eingeführt. Die Aspektklasse IntStackWithTracing wird nun von den Klassen BeforeConstructor, AfterConstructor und IntStack abgeleitet; und zwar in genau diese Reihenfolge! So wird bei einer Instanzierung der Aspektklasse zuerst der Konstruktor von BeforeConstructor, dann der Konstruktor der Fachklasse und zuletzt der Konstruktor der Aspektklasse abgearbeitet. Ein ähnliches Verhalten für die Destruktoren findet man bei der Zerstörung einer Instanz der Aspektklasse. namespace original namespace aspects typedef original :: IntStack IntStack ; class BeforeConstructor BeforeConstructor() cout << Before constructor << endl; ; Listing 6: Konstruktoren und Destruktoren struct AfterDestructor AfterDestructor () cout << After destructor << endl; ; class IntStackWithTracing: private BeforeConstructor, private AfterDestructor, public IntStack Tracing() cout << After constructor << endl; void push(const int& i) IntStack :: push(i); valuetype pop() return IntStack :: pop(); 5
6 ; Tracing() cout << Before destructor << endl; Die private-vererbung von BeforeConstructor und AfterConstructor dient dazu, die Verwendung von Methoden der Hilfsklassen in anderen Klassen, die eventuell von IntStack abgeleitet werden, zu verhindern. 4.2 Anwendung von einem Aspekt auf mehrere Klassen Wenn man einen Aspekt mit mehreren Fachklassen verweben will, darf man den Aspektcode nicht abhängig von einer Fachklassen machen, so wie es bisher geschah. Um den Aspektcode flexibler zu gestalten, besteht die Möglichkeit Aspekte in Form von Klassen-Templates zu realisieren. Wie in Listing 7 zu sehen ist, wird die Aspektklasse von der Klasse abgeleitet, die ihr als Template- Parameter übergeben wurde. Probleme treten nun bei den Funktionen auf, deren Paramerter- oder Rückgabetypen von der konkreten Fachklasse abhängen; in unseren Fall double oder int. Mit Traits Templates ist es jedoch möglich den Typ zur Übersetzungszeit herauszufinden. Traits Classes und Member Traits erscheinen hier nicht als geeignet, da man hierfür Code der Fachklasse verändern müsste. Mehr zu Thema Metainformation findet man in [1], [3] und in einschlägiger Fachliteratur. Für jeden verwendeten Stack-Typ wird im Namensraum aspects ein spezialisiertes Klassen-Template von ValueType angelegt, welches die Information über den entsprechenden Stack-Typ beinhaltet. namespace original class DoubleStack // gleicher Aufbau wie IntStack namespace aspects template <class T> struct ValueType ; template<> struct ValueType<original :: IntStack> typedef int RET; ; template<> struct ValueType<original :: DoubleStack> typedef double RET; ; Listing 7: flexibler Aspektcode // ReportTracing wie in Listing 2 template <class Base> class Tracing : public Base typedef typename ValueType<Base>::RET valuetype; void push(const valuetype& i) 6
7 Base::push(i); valuetype pop() return Base::pop(); namespace composed // typedef original :: IntStack IntStack ; typedef aspects :: Tracing< original :: IntStack> IntStack; typedef original :: DoubleStack DoubleStack; //typedef aspects :: Tracing< original :: DoubleStack> DoubleStack; 4.3 Verweben von mehreren Aspekten mit mehreren Klassen Bisher wurde zu einer Fachklasse immer nur ein Aspekt hinzugefügt. Nun wird eine Möglichkeit vorgestellt, mehrere Aspekte mit einer Klasse zu verküpfen; in unserem Beispiel (Listing 8) werden die Aspekte Checking und/oder Tracing den Fachklassen DoubleStack und/oder IntStack hinzugefügt. Wie in Kapitel 4.2 werden die Aspekte als Klassen-Templates implementiert. Wenn zwei Aspekte auf eine Klasse angewendet werden sollen, hat man bei der zweiten Anwendung das Problem, dass für die übergebene Klasse keine Typ-Information vorhanden ist. Eine Lösung wäre somit für alle vorkommenden Verküpfungs-Kombinationen(IntStack, IntStack+Tracing, IntStack+Checking, IntStack+Checking+Tracing, IntStack+Tracing+Checking, DoubleStack,...) die Typ-Information bereit zu stellen, was jedoch schnell ausufern würde. Eine bessere Möglichkeit bietet der inheritance detector der zur Übersetzungszeit Vererbungsbeziehungen zwischen zwei Klassen feststellt. Mit dem inheritance detector und der Meta-Kontrollstruktur IF kann nun die richtige Typ-Information (ValueTyp) ermittelt werden. Nähere Informationen zum Thema Meta-Funktionen findet man in [3]. Jede Fachklasse, auf die irgendein Aspekt angewendet werden soll, muss mit der Klasse, die der Aspektklasse als Template-Parameter übergeben wurde, bezüglich ihrer Vererbungsbeziehung hin überprüft werden. Fällt dieser Test positiv aus, wird die Typ-Information der positiv getesten Fachklasse zurückgegeben. namespace original class DoubleStack // gleicher Aufbau wie IntStack namespace aspects // ValueType wie in Listing 7 Listing 8: Weben mehrerer Aspekte // inheritance detector : siehe naechsten kommentar template<class Base> struct InheritDetector typedef char (&no)[1]; typedef char (&yes)[2]; static yes test ( Base ); static no test (... ) ; 7
8 ; // inheritance detector : ermittelt ob die Klasse Derived von Base abgeleitet ist template<class Derived, class Base> struct Inherits typedef Derived DP; enum RET = sizeof ( InheritDetector <Base>::test(DP()) ) == sizeof ( InheritDetector <Base>::yes ) ; ; // meta IF struct SelectThen template<class Then, class Else> struct Result typedef Then RET; ; ; //meta IF struct SelectElse template<class Then, class Else> struct Result typedef Else RET; ; ; //meta IF template<bool condition> struct Selector typedef SelectThen RET; ; //meta IF template<> struct Selector <false> typedef SelectElse RET; ; //meta IF template<bool condition, class Then, class Else> struct IF typedef typename Selector<condition>::RET Selector ; typedef typename Selector ::Result<Then,Else>::RET RET; ; // Ermittelt Typ Information der Klasse T template <class T> struct GetType 8
9 typedef typename IF<( Inherits <T, original :: IntStack>::RET), ValueType<original :: IntStack>::RET, typename IF<(Inherits<T,original::DoubleStack>::RET), ValueType<original :: DoubleStack>::RET, void >::RET >::RET RET; ; // ReportTracing wie in Listing 2 //Tracing Aspekt template <class Base> class Tracing : public Base typedef typename GetType<Base>::RET valuetype; void push(const valuetype& i) Base::push(i); ; valuetype pop() return Base::pop(); // Hilsklasse fuer den Checking Aspekt class CheckingException: public exception CheckingException(const char msg):msg (msg) const char what() const throw() return msg ; private: const char msg ; ; //Checking Aspekt template <class Base> class Checking: public Base typedef typename GetType<Base>::RET valuetype; void push(const valuetype& i) if ( size () == capacity()) throw CheckingException( stack overflow ); Base::push(i); valuetype pop() 9
10 ; if ( size () <= 0) throw CheckingException( stack underrun ); Base::pop(); namespace composed // typedef original :: IntStack IntStack ; // typedef aspects :: Tracing< original :: IntStack> IntStack; // typedef aspects :: Checking<original :: IntStack> IntStack; // typedef aspects :: Checking<aspects::Tracing< original :: IntStack> > IntStack; typedef aspects :: Tracing<aspects::Checking<original :: IntStack> > IntStack; // typedef original :: DoubleStack DoubleStack; // typedef aspects :: Tracing< original :: DoubleStack> DoubleStack; // typedef aspects :: Checking<original :: DoubleStack> DoubleStack; // typedef aspects :: Checking<aspects::Tracing< original :: DoubleStack> > DoubleStack; typedef aspects :: Tracing<aspects::Checking<original :: DoubleStack> > DoubleStack; 5 Zusammenfassung Viele anschauliche Beispiele haben gezeigt, dass Aspekt-orientierte Programmierung mit reinem C++ unter den geforderten Bedingungen durchaus möglich ist. Jedoch ist dieser Ansatz eher zu vergleichen mit Objekt-orientierter Programmierung in der Programmiersprache C, welcher einfach die Sprachmittel fehlen um OO-Konzepte übersichtlich und effizient zu realisieren. Nun muss man sich die Frage stellen welche Sprachmittel nötig sind um effizient AOP zu betreiben. Mit AspectJ ist ja schon ein großer Schritt unternommen worden genau diese Sprachmittel zu identifizieren. Daran müssen sich jetzt andere Konzepte messen, was keine leichte Aufgabe darstellt. Literatur [1] Ulrich W. Eisenecker, Lutz Dominik, Krzysztof Czarnecki, Aspektorierte Programmierung in C++, ix, Ausgabe 8/01 bis 10/01, Heise-Verlag, [2] Gregor Kiczales, et al., Aspect-Oriented Programming, Springer-Verlag LNCS 1241, [3] Ulrich W. Eisenecker, Krzysztof Czarnecki, Template-Metaprogrammierung. Eine Einführung, OBJEKTspektrum, Ausgabe Mai/Juni,
Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 29
Kapitel 2 Einführung in C++ Seite 1 von 29 C++ Zeichensatz - Buchstaben: a bis z und A bis Z. - Ziffern: 0 bis 9 - Sonderzeichen: ; :,. # + - * / % _ \! < > & ^ ~ ( ) { } [ ]? Seite 2 von 29 Höhere Elemente
HSR Rapperswil 2001 Markus Rigling. Programmieren: Templates Auflage
HSR Rapperswil 2001 Markus Rigling Programmieren: Templates 1 1. Auflage Inhaltsverzeichnis: Templates.1 1. Verwendung 3 2. Erstellen einer Templateklasse. 3 3. Faustregel zum Erstellen eines Klassentemplates..
C++ Quellcodes zum Buch Kapitel 5
1 HARALD NAHRSTEDT C++ für Ingenieure Einführung in die objektorientierte Programmierung Erstell am 27.04.2009 C++ Quellcodes zum Buch Kapitel 5 Beschreibung Diese Seiten enthalten den Quellcode aus dem
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)
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
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
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
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
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
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
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
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 5. Behälter und Iteratoren 6. Templates
Polymorphe for-anweisung 237
Polymorphe for-anweisung 237 Beginnend mit C++11 wird for (for-range-declaration : expression) statement durch den Übersetzer zu folgendem Programmtext expandiert: { auto&& range = (expression); for (auto
Aufbau von Klassen. class punkt {...
Einführung in C++ Aufbau von Klassen Eine wird mit dem Schlüsselwort class eingeleitet, und endet mit einem Semikolon. Der Inhalt wird zwischen geschweiften Klammern geschrieben. class punkt {... ; Im
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
7. Übung Informatik II - Objektorientierte Programmierung
7. Übung Informatik II - Objektorientierte Programmierung 29. Mai 2015 Inhalt 1 2 3 Übersicht 1 2 3 Idee Menschen nehmen die Welt in Form von Objekten wahr manche Objekte haben gleiche Eigenschaften, hierüber
1 Motivation und Einleitung
AspectJ - AOP für Java Georg Blaschke (georg.blaschke@stud.informatik.uni-erlangen.de) Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl für Betriebssysteme und Verteilte Systeme 3. Mai 2003
Objektorientierte Programmierung mit C Strukturierte Anweisungen: Exception Handling
1.5. Strukturierte Anweisungen: Exception Handling Exceptions sind Objekte beliebigen Typs stack unwinding ruft Destruktoren aller erfolgreich konstruierten Objekte in einem catch-block kann eine Exception
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)
Info-2, Klausurvorbereitung, SS 2016
Info-2, Klausurvorbereitung, SS 2016 Die folgenden Fragen dienen der Vorbereitung auf die Klausur. Die hier gestellten Aufgaben sind umfangreicher als in der Klausur. In der Klausur sind die Fragen schriftlich,
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
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.
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
3. Exkurs in weitere Arten der Programmierung
3. Exkurs in weitere Arten der Programmierung Inhalt: Objektorientierte Programmierung in C++ Logische Programmierung in Prolog Peter Sobe Objektorientierte Programmierung in C++ C++ ist eine objektorientierte
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
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
Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.
Seite 1 von 9 Hiermit bestätige ich, dass ich die Übungsleistungen als Voraussetzung für diese Klausur in folgender Übung erfüllt habe. Jahr: Übungsleiter: Unterschrift: 1. Aufgabe ( / 12 Pkt.) Was liefert
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.
Crashkurs C++ Wiederholung
Crashkurs C++ Wiederholung #include int main(void) { int i, j; bool is_prime; for (j = 1; j < 1000; j += 2) { is_prime = true; for (i = 3; i
spectj AOP mit Java, Konzepte und Beispiele
A spectj AOP mit Java, Konzepte und Beispiele AspectJ Ist eine Erweiterung von Java Ist eine aspektorientierte Sprache (wie Java eine objektorientierte Sprache ist) Ist frei verfügbar der Compiler ist
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
initializer lists (nicht für Referenzen... unklar warum...)
initializer lists (nicht für Referenzen... unklar warum...) 1 class Y{ y ; Y &ref (y) ; // ok Y &ref {y ; // Fehler: g++, MS VS C++11 47 preventing narrowing int x = 7.3; // Ouch! void f(int); f(7.3);
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
Klausur: Grundlagen der Informatik I, am 27. März 2009 Gruppe: F Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.
Seite 1 von 9 Hiermit bestätige ich, dass ich die Übungsleistungen als Voraussetzung für diese Klausur in folgender Übung erfüllt habe. Jahr: Übungsleiter: Unterschrift: 1. Aufgabe ( / 15 Pkt.) Was liefert
Grundlagen der Informatik
Grundlagen der Informatik Musterklausur 1. Dynamische Datenstrukturen und objektorientierte Programmierung Zur Verwaltung einer digitalen Fotogalerie sollen Techniken der objektorientierten Programmierung
Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.
Innere Klassen Innere Klassen Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen. Literatur: Java Tutorial & Arnold, K., Gosling, J. und Holmes,D... Page 1 Innere Klassen Der erste
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
Angewandte Mathematik in OOP WS 2011/12. Abschluss-Test
Angewandte Mathematik in OOP WS 2011/12 Abschluss-Test 012 6 5 4 5 6 Aufgabe 1 (9 Punkte 1 Punkt je Antwort) Bitte jeweils eine Antwort ankreuzen (je nach Fragestellung die richtige oder falsche): a.)
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
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
C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue
C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen Leibniz Universität IT Services Anja Aue Modularisierung Logische Gliederung von Programmteilen mit Hilfe von Namensräumen. Aufteilung
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
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:
Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen
1 Thema heute: Vererbung und Klassenhierarchien Abgeleitete Klassen Vererbung von Daten und Funktionen Virtuelle Funktionen 2 Vererbung oft besitzen verschiedene Datentypen einen gemeinsamen Kern Beispiel:
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
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
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
Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz
Kapitel 13 Abstrakte Methoden und Interfaces 13. Abstrakte Klassen und Interfaces 1. Abstrakte Klassen 2. Interfaces und Mehrfachvererbung Folie 12.2 Abstrakte Methoden und Klassen Manchmal macht es überhaupt
Ü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
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
Objektorientiertes Programmieren mit C++ für Fortgeschrittene
BEREICH DATENTECHNIK I CQ 300 00 TH 02 Objektorientiertes Programmieren mit C++ für Fortgeschrittene Kapitel 3 3. Mehrfachvererbung 3.1. Eigenschaften und Problematik 3.2. Virtuelle Basisklassen BEREICH
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
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny
Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny 7. Funktionen Einleitung Nach dem Prinzip Divide and Conquer bietet es sich an, größere Aufgaben in kleinere Teile zu unterteilen. Anweisungsblöcke,
(Ausnahmebehandlung)
16. Exceptions (Ausnahmebehandlung) 16-1 Objektorientierte Programmierung (Winter 2010/2011) Kapitel 16: Exceptions (Ausnahmebehandlung) Motivation Throw und Catch 16. Exceptions (Ausnahmebehandlung) 16-2
Klausur im WS 2003/04 : Informatik III
Dr.-Ing. Hartmut Helmke Fachhochschule Braunschweig/Wolfenbüttel Fachbereich Informatik Matrikelnummer: Punktzahl: Ergebnis: Freiversuch F1 F2 F3 Klausur im WS 2003/04 : Informatik III Hilfsmittel sind
Metaprogrammierung 372
Metaprogrammierung 372 thales$ g++ -c -fpermissive -DLAST=30 Primes.cpp 2>&1 fgrep In instantiation Primes.cpp: In instantiation of void Prime_print::f() [with int i = 29] : Primes.cpp: In instantiation
Schriftlicher Test (120 Minuten) VU Einführung ins Programmieren für TM. 25. Jänner 2016
Familienname: Vorname: Matrikelnummer: Aufgabe 1 (3 Punkte): Aufgabe 2 (4 Punkte): Aufgabe 3 (2 Punkte): Aufgabe 4 (2 Punkte): Aufgabe 5 (2 Punkte): Aufgabe 6 (1 Punkte): Aufgabe 7 (3 Punkte): Aufgabe
4 Generische Programmierung. 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer)
4 Generische Programmierung 4.1 Klassen-Templates (*) 4.2 Funktions-Templates (*) 4.3 Besondere Programmiertechniken (Smart Pointer) (*) Auch in dieser Datei. V 4.05; Hon. Prof. Helmke 1 Intelligente Zeiger
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
19. Vererbung und Polymorphie
667 19. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens (Ausdrucks-)Bäume -(3-(4-5))*(3+4*5)/6
Einführung in das Objektorientierte Programmieren mit C++
BEREICH DATENTECHNIK I CP 700 00 TH 03 Einführung in das Objektorientierte Programmieren mit C++ Kapitel 7 7. Laufzeit-Polymorphie 7.1. Frühes und spätes Binden 7.2. Virtuelle Funktionen FG TECHNISCHE
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
Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)
12. Vererbung Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)!Vererbung Konzept!Protected Section!Virtuelle Mitgliedsfunktionen!Verwendung von Vererbung Copyright: M. Gross, ETHZ, 2003 2 Vererbung!
19. Vererbung und Polymorphie
(Ausdrucks-)Bäume 19. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens -(3-(4-5))*(3+4*5)/6
kurze Wiederholung class templates
kurze Wiederholung class templates Ein class template ist ein Template, dass mit einem oder mehreren typename -Parametern implementiert wird. Um solch ein Template zu benutzen, übergibt man dem Template
Objektorientierte Programmierung mit C++ SS 2007
Objektorientierte Programmierung mit C++ SS 2007 Andreas F. Borchert Universität Ulm 5. Juni 2007 Polymorphismus #include Function.h class Function { public: virtual ~Function() {}; virtual std::string
Informatik I (D-ITET)
//009 Informatik I (D-ITET) Übungsstunde 8, 6..009 simonmayer@student.ethz.ch ETH Zürich Besprechung/Vertiefung der Vorlesung [..009] ArrayStack Ausgezeichnet Einige haben s etwas kompliziert gemacht clear()
7. Vererbung und Polymorphie
210 7. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens (Ausdrucks-)Bäume -(3-(4-5))*(3+4*5)/6
Realisierungsmöglichkeiten für parametrische Polymorphie
4. Parametrisierbare Klassen Realisierung von Generics Realisierungsmöglichkeiten für parametrische Polymorphie heterogen Für jeden konkreten Typ wird individueller Code erzeugt (type expansion). Diesen
Programmierkurs. Steffen Müthing. December 7, Interdisciplinary Center for Scientific Computing, Heidelberg University
Programmierkurs Steffen Müthing Interdisciplinary Center for Scientific Computing, Heidelberg University December 7, 2018 Code Reuse Motivation Konzepte Vererbung (Idee) Templates Worum geht es? Datenstrukturen
FOG. Thomas Grzenkowski.
FOG Thomas Grzenkowski sithgrze@stud.informatik.uni-erlangen.de Die Weiterentwicklung von OOP zur Unterstützung von Entwurfsmustern und Aspekten erfordert die Unterstützung von Seiten der Sprache. Die
Wie schreibe ich ein Powerbook
739 22. Subtyping, Polymorphie und Vererbung Ausdrückbäume, Aufgabenteilung und Modularisierung, Typhierarchien, virtuelle Funktionen, dynamische Bindung, Code-Wiederverwendung, Konzepte der objektorientierten
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
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
11 Vererbung und Klassenhierarchie
11 Vererbung und Klassenhierarchie Bestandteile objektorientierter Programmierung: Bestehende Klassen können durch Spezialisierung und Erweiterung weiterentwickelt werden, ohne den Programmcode der alten
18. Vererbung und Polymorphie
617 18. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens (Ausdrucks-)Bäume -(3-(4-5))*(3+4*5)/6
Kapitel 11: Vererbung Ziele von Klassen Einführung in die Informatik für struct Naturwissenschaftler und Ingenieure
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
18. Vererbung und Polymorphie
590 18. Vererbung und Polymorphie Ausdrucksbäume, Vererbung, Code-Wiederverwendung, virtuelle Funktionen, Polymorphie, Konzepte des objektorientierten Programmierens (Ausdrucks-)Bäume 591 -(3-(4-5))*(3+4*5)/6
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
Klausurvorbereitung Lösung
Ausgabe 1 a) unsigned char erzeuge_bitmuster() static int z=0; int rest; unsigned char bm; rest = z % 4; z=z+1; switch (rest) case 0: bm = 0x00; break; case 1: bm = 0x11; break; case 2: bm = 0x33; break;
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
Kapitel 5: Interfaces
Liste P: Programmieren mit Java WS 2001/2002 Prof. Dr. V. Turau FH Wiesbaden Kapitel 5: Interfaces Folie 82 : Einleitung Betrachtet man die Programmierleistung für ein Produkt über einen längeren Zeitraum,
Klausur: Informatik, am 11. Juli 2013 Gruppe: B Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.: Punkte:
Seite 1 von 10 Hiermit bestätige ich, dass ich die Übungsleistungen als Voraussetzung für diese Klausur in folgender Übung erfüllt habe. Jahr: Übungsleiter: Unterschrift: 1. Aufgabe ( / 6 Pkt.) a) Geben
Coding Conventions. for C++ Reto Carrara Gyrenstrasse 17 CH-8967 Widen +4179/
Coding Conventions for C++ Reto Carrara Gyrenstrasse 17 CH-8967 Widen +4179/328 17 05 www.carrara.ch info@carrara.ch Inhalt Inhalt...2 Revision...3 Einführung...4 Klassen- und Struct-Namen...5 Makros...6
Aufgabenblatt 11 Musterlösung
Programmierkurs Aufgabenblatt 11 Dr. Ole Klein, Dr. Steffen Müthing Abgabe 09. Februar 2018 IWR, Universität Heidelberg ipk-exercises:2017-ws-89-g0001213 Hinweise zur Klausur: Aufgabenblatt 11 Die Klausur
Objektorientierte Programmierung mit C++ den sog. default constructor X (){}
Wann immer Objekte entstehen, läuft automatisch ein (passender) Konstruktor! Wann immer Objekte verschwinden, läuft automatisch der Destruktor! Klassen ohne nutzerdefinierten Konstruktor/Destruktor besitzen
OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik
Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik WS 2011/12 Inhalt Templates Nochmal zusammengefasst Die Basis der OOP- Zusammengefasst 2 Templates Programmiersprachen
Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe.
Was du ererbt von Deinen Vätern hast, erwirb es, um es zu besitzen. J. W. v. Goethe http://www.zitate-online.de/autor/goethe-johann-wolfgang-von/ http://www.weimar-lese.de/files_weimar_lese/johann_wolfgang_von_goethe_bearbeitet_von_andreas_werner.jpg
Programmierung und Angewandte Mathematik
Programmierung und Angewandte Mathematik C++ /Scilab Programmierung und Einführung in das Konzept der objektorientierten Anwendungen zu wissenschaftlichen Rechnens SS 2012 Inhalt Compiler/Editor Klassendeklaration
Modernes C++ Compilation Firewall Exception-Safe Function Calls. Philippe Lieser
Modernes C++ Compilation Firewall Exception-Safe Function Calls Philippe Lieser Compilation Firewall 2 Compilation Firewall - Problem wenn im Header File die Klassendefinition geändert wird, muss sämtlicher
HSR Rapperswil 2001 Markus Rigling. Programmieren: Smart Pointer Auflage
HSR Rapperswil 2001 Markus Rigling Programmieren: Smart Pointer 1 1. Auflage Inhaltsverzeichnis: 1. Smart Pointer3 2. Vor- Nachteile von Smart Pointer..3 3. auto_ptr..3 4. Umsetzung / Anwendung:.4 5. Wertzuweisung
Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)
Stefan Brass: OOP (Java), 22. Aufzählungstypen 1/20 Objektorientierte Programmierung Kapitel 22: Aufzählungstypen (Enumeration Types) Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester
Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen
Kapitel 9 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Attribute von Klassen, Methoden und Variablen Interfaces WS 07/08 1/ 18 2/ 18
Einführung in C# Teil 3. Matthias Nübling
Einführung in C# Teil 3 Matthias Nübling Vorausgesetzte Grundkenntnisse Programmierung Typen, Variablen, Anweisungen, Funktionen, etc. Objektorientierte Programmierung Klassen, Vererbung, Polymorphismus,
C++ Klassen, Vererbung. Philipp Lucas. Sebastian Hack. Wintersemester 2008/09. saarland.
C++ Klassen, Vererbung Philipp Lucas phlucas@cs.uni-sb.de Sebastian Hack hack@cs.uni-sb.de Wintersemester 2008/09 saarland university computer science 1 Inhalt Klassen in C++ Sichtbarkeit Erzeugen von
Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter
Kapitel 1 Der vierte Tag 1.1 Vererbung Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter Sprachen. Unter Vererbung versteht man die Möglichkeit, Eigenschaften vorhandener
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