220 likes | 352 Views
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:
E N D
Generische ProgrammierungC++ Templates Emad Saddiq
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++
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++
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++
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++
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++
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++
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++
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++
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++
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++
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++
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++
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++
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++
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++
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++
TypunabhängigeProgrammierung int Stack::pop(){ assert(top>0); top--; return data[top]; } Universität Bonn Informatik Programmierpraktikum C++
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++
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++
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++
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++