1 / 22

Generische Programmierung C++

Generische Programmierung C++. Templates Emad Saddiq. Grundprinzip. Unabhängigkeit der Strukturen vieler Algorithmen vom Datentyp , auf dem sie operieren. Formulierung der Algorithmen, unabhängig vom Datentyp Beispiel:

Download Presentation

Generische Programmierung C++

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Generische ProgrammierungC++ Templates Emad Saddiq

  2. Grundprinzip • Unabhängigkeit der Strukturen vieler Algorithmen vom Datentyp , auf dem sie operieren. • Formulierung der Algorithmen, unabhängig vom Datentyp Beispiel: Addition und Multiplikation für komplexe Zahlen ist genauso wie für reelle Zahlen oder ganze Zahlen ausführbar Universität Bonn Informatik Programmierpraktikum C++

  3. Templates • Templates dienen dazu, Vorlagen für Funktionen (auch Klassen) zu schreiben, die für verschiedene Datentypen das gleiche Leisten sollen. • Erst bei Verwendung einer solchen Klasse oder Funktion, nicht bereits aber bei deren Definition oder Deklaration muss der Datentyp festgelegt werden. Universität Bonn Informatik Programmierpraktikum C++

  4. Templates • Mit Templates haben wir die Möglichkeit, eine Funktion zu definieren, wobei wir ein oder mehrere Datentypen durch Platzhalter ersetzen. • Bei solchen Funktionen kann der Compiler den benötigten Datentyp durch die Betrachtung des Argumentes bestimmen, mit dem die Funktion aufgerufen wird. Universität Bonn Informatik Programmierpraktikum C++

  5. Warum Templates ? inline int quad(int x) { return x*x; } inline short quad(short x) { return x*x; } inline double quad(double x) { return x*x; } Universität Bonn Informatik Programmierpraktikum C++

  6. Warum Templates? #define quad(a) (a)*(a) void main() { int x = 3, y; short m = 4, n; double a = 4.5, b; y = quad(x); // Präprozessor ersetzt zu y = (x)*(x); = 9 ok. Universität Bonn Informatik Programmierpraktikum C++

  7. Warum Templates? n = quad(m); // ==> n = (m)*(m); = 16 ok. b = quad(a); y = quad(x++); // ==> y = (x++)*(x++) = 20 = 5*4 Fehler! } Universität Bonn Informatik Programmierpraktikum C++

  8. Template-Funktionen • Definitionen und Deklaration von template-Funktionen und Klassen werden durch das Schlüsselwort template eingeleitet. • Die Angabe der template-Parameter erfolgt in spitzen Klammern. Universität Bonn Informatik Programmierpraktikum C++

  9. Beispiel-1 template <typename T> bool swap(T& a, T& b) { T t= a; a= b; b= t; } int a=4; int b=5; swap<int>( a, b ); Universität Bonn Informatik Programmierpraktikum C++

  10. Beispiel-2 template <class TYP>TYP minmax( TYP a, TYP b){   return (a < b) ? a : b;}void main(){   cout << minmax<float>( 1.0, 2.0) << endl;   cout << minmax<int> ( 5, 7 ) << endl;} Universität Bonn Informatik Programmierpraktikum C++

  11. Aufruf mit verschiedenen Typen template <class T1, class T2> inline T1 max(T1 a, T2 b) { return a > b ? a : c; } void main() { int x, y = 3, z = 4; double a, b = 1.4, c = 7.3; short m, n = 6, o = 9; x = max(y, z); // max(int, int) a = max(b, c); // max(double, double) m = max(n, o); // max(short, short) x = max(y, o); // max(int, short) x = max(o, y); // max(short, int) } Universität Bonn Informatik Programmierpraktikum C++

  12. Template-Klassen • Wie bei Funktionen können wir auch für Klassen Parameter angeben. • Dann muss allerdings bei der Instanzenbildung der gewünschten Typ in spitzen Klammern angegeben werden. Universität Bonn Informatik Programmierpraktikum C++

  13. Beispiel einer Stack-Klasse • Ein Stack ist ein Stapel von Datenelementen. • Neue Elemente werden auf dem Stapel abgelegt (push Operation) und auch von oben wieder entfernt (pop Operation). • Stacks werden auch LIFO (last-in first-out) Puffer genannt. Universität Bonn Informatik Programmierpraktikum C++

  14. Herkömmliche Programmierung main.cc: #include <iostream> #include "stack.h" int main(){ Stack queue; queue.push(1); queue.push(2); std::cout << queue.pop() << "\n"; std::cout << queue.pop() << "\n"; } Universität Bonn Informatik Programmierpraktikum C++

  15. Herkömmliche Programmierung stack.h: class Stack { public: Stack(): top(0){} ~Stack(){} void push(int a); int pop(); private: static const int max_size = 17; int data[max_size]; int top; }; Universität Bonn Informatik Programmierpraktikum C++

  16. TypunabhängigeProgrammierung #ifndef STACK_H #define STACK_H #include<assert.h> template<typename T> class Stack { public: Stack(): top(0){} ~Stack(){} void push(int a); T pop(); Universität Bonn Informatik Programmierpraktikum C++

  17. TypunabhängigeProgrammierung private: static const int max_size = 17; T data[max_size]; int top; }; Template<typename T> void stack<T>::push(T d){ assert(top<max_size); data[top]=d; top++;} Universität Bonn Informatik Programmierpraktikum C++

  18. TypunabhängigeProgrammierung int Stack::pop(){ assert(top>0); top--; return data[top]; } Universität Bonn Informatik Programmierpraktikum C++

  19. TypunabhängigeProgrammierung • Statt typename darf bei der Deklaration des Template-Argumentes auch class verwendet werden, was die Schreibarbeit etwas verringert; • beide Schlüsselworte deuten an, daß es sich bei dem Template Argument um einen Typ handeln muß. Universität Bonn Informatik Programmierpraktikum C++

  20. Wie benutzt man Templates? • Um Templates zu benutzen, muss im Programmteil, das den Stack benutzt, das template-Argument durch einen wirklichen Typ oder eine benutzerdefinierte Klasse ersetzt werden: Universität Bonn Informatik Programmierpraktikum C++

  21. Wie benutzt man Templates? #include <iostream> #include "stack.h" int main(){ Stack<int> queue; queue.push(1); std::cout << queue.pop() << "\n"; } Universität Bonn Informatik Programmierpraktikum C++

  22. Literatur • B.Stroustrup, Die C++Programmiersprache, Addison-Wesley • Ulrich Breymann, C++-Eine Einführung , Hanser. • The cplusplus.com Tutorial http://www. cplusplus.com/doc/tutorial/. Universität Bonn Informatik Programmierpraktikum C++

More Related