Programmieren - C++ Funktions-Templates

Ähnliche Dokumente
Programmieren - C++ Templates

Programmieren - C++ Templates

Programmieren in C++ Templates

C++ Quellcodes zum Buch Kapitel 5

4. Objektorientierte Programmierung mit C++

HSR Rapperswil 2001 Markus Rigling. Programmieren: Templates Auflage

C++ Teil 4. Sven Groß. 30. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 16

C++ Teil 5. Sven Groß. 12. Nov IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

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

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

Programmieren 2 C++ Überblick. Programmieren 2 C++ Überblick: 6. Templates und generische Programmierung. 6. Templates und generische Programmierung

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

Visuelle Kryptographie. Anwendung von Zufallszahlen

Container/ Collection: Klasse die (Pointer auf ) andere Klassen oder Typen int,char,bool etc. aufnimmt.

Ein kleiner Blick auf die generische Programmierung

Repetitorium Programmieren I + II

Repetitorium Programmieren I + II

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

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Die C++ Standard Template Library Andreas Obrist

Informatik I (D-ITET)

Sortieren durch Mischen (Mergesort; John von Neumann 1945)

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

Funktionen: Rückgabewert

Polymorphismus 44. Function.hpp. #include <string>

Praxis der Programmierung

Computergrundkenntnisse und Programmieren, WS 07/08, Übung 11: Klassen der Standardbibliothek 2

Praxisorientierte Einführung in C++ (Variadische Funktionen)

Vorlesungsprüfung Programmiersprache 1

9. Funktionen Teil II

Beispiel 1/3. Abstrakte Datentypen. Beispiel 3/3. Beispiel 2/3. Abstrakte Klasse SortierVerfahren

Objektorientierte Programmierung mit C++ SS 2007

C++ Teil 5. Sven Groß. 16. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16

Objektorientierte Anwendungsentwicklung

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

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

6 Algorithmen und Datenstrukturen

Grundlagen der Informatik 9. Funktionen II

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

Polymorphismus 179. Function.h. #include <string>

Kapitel 13. Definition von Klassen. OOP Thomas Klinker 1

Variablen in C++ Einfache Variablen Strukturen Arrays und Zeichenketten Zeiger und Referenzen Parameter Dynamische Speicherverwaltung

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Einleitung Typsystem Typisierung Zusammenfassung Literatur. Typisierung. Effiziente Programmierung. Thomas Schnieders

Objektorientierte Programmierung

Polymorphie Begriffsklärung und Anwendung

(08 - Einfache Sortierverfahren)

Grundlagen der Objektorientierten Programmierung - Methoden -

Grundlagen der Informatik 12. Strukturen

12/18/12 // POST: values of a and b are interchanged void swap (int& a, int& b) { int c = a; a = b; b = c;

Programmierkurs Java

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Typklassen. Natascha Widder

Objektorientierte Programmierung mit C++ SS 2007

Angewandte Mathematik in OOP WS 2011/12. Abschluss-Test

Einführung in die Programmierung Wintersemester 2018/19

Angewandte Mathematik und Programmierung

Einführung in die Programmierung

Hochschule Darmstadt Informatik-Praktikum SS 2018 EIT Bachelor 3. Aufgabenblatt Funktionen - Unterprogramme

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

10.4 Konstante Objekte

Projekt 3 Variablen und Operatoren

C++ - Objektorientierte Programmierung Polymorphie

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

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

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

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

Grundlagen von C# - 1

Methoden. von Objekten definiert werden, Methoden,, Zugriffsmethoden und Read-Only

Programmieren in C++ Überblick

Probeklausur: Programmierung WS04/05

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

5.3 Auswertung von Ausdrücken

Einführung in die STL

Einführung in die Programmierung Wintersemester 2008/09

Inhalt. 4.9 Typen, Variable und Konstante

Einführung in C. EDV1-04C-Einführung 1

Programmieren 2 C++ Überblick

Prüfung aus PROGRAMMIEREN (2) (C++) (WS 2002/03)

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

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

Praxis der Programmierung

Kapitel 5: Funktionen. Inhalt

Klausur: Programmieren II

Grundlagen der Informatik 2. Typen

Thema heute: Vererbung und Klassenhierarchien. Abgeleitete Klassen. Vererbung von Daten und Funktionen. Virtuelle Funktionen

C++ Bit-Access. Detlef Wilkening

Objektorientierte Anwendungsentwicklung

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

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

Klausur: Grundlagen der Informatik I, am 06. Februar 2009 Gruppe: A Dirk Seeber, h_da, Fb Informatik. Nachname: Vorname: Matr.-Nr.

Grundkurs C++ IDE Klassenhierarchien

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren

Grundkurs C++ IDE Klassenhierarchien

C++ Templates - eine kleine Einführung

Repetitorium Programmieren I + II

Grundkurs C++ IDE Klassenhierarchien

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

Programmierung in C: Vermischtes (Teil 1)

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

Transkript:

Programmieren - C++ Funktions-Templates Reiner Nitsch 8471 r.nitsch@fbi.h-da.de

Was sind Templates? C++ Templates ermöglichen generische Programmierung. Das ist Programmierung unabhängig vom speziellen Objekt-Typ Templates sind Schablonen mit parametrisierten Datentypen d.h. mit Platzhaltern für Typen (Typ-Parameter oder Proxy-Parameter ): So wie das Laufzeitsystem beim Funktionsaufruf die Aktual-Parameter an Stelle der in der Deklaration benannten Formal-Parameter einsetzt, werden bei Templates vom Compiler zur Compilezeit die Aktual-Typen an Stelle der deklarierten Formal-Typparameter eingesetzt. C++ unterscheidet zwischen Funktionstemplates (dieses Kapitel) und Klassentemplates (später) Beispiel für Funktionstemplates: Vertauschen von int-, double-, string- oder Konto-Objekten void swap( int& a, int& b ) int temp(a); a = b; b = temp ; Algorithmus ist unabhängig vom Datentyp! void swap( Konto& a, Konto& b ) Konto temp(a); a = b; b = temp ; Anforderungsprofil: Welche Ansprüche stellt der Algorithmus an die Typen 'int' und 'Konto'? Soll die Operation "swap" mit dem Konzept der Fkt-Überladung für m verschiedene Datentypen realisiert werden, so muß die Funktion m-fach überladen werden (ggf. mittels Cut&Paste und Typanpassung; Fehleranfällig). Mit dem C++-Template-Konzept muß die Funktion nur einmal definiert werden, um für beliebige Typen, die dem Anforderungsprofil genügen, anwendbar zu sein. 20.06.08 C++ Funktions-Templates 2

Beispiel 1: Funktion vertausche als Funktionstemplate Beispiel 1: Deklariert Funktion als Template, das vom Compiler erst bei Bedarf übersetzt wird. Proxy-Typ T kann auch einfacher Datentyp sein! Auch mehrere kommaseparierte Typparameter sind möglich void swap( int& a, int& b ) int tmp(a); a = b; b = tmp ; Anwendung des Templates swap void main() int a=5, b=6; swap( a, b ); double x=2.0, y=3.0; swap( x, y ); swap( a, x ); Compiler ersetzt jedes T durch int! template < typename T > void swap( T& a, T& b ) Achtung! T tmp(a); Copy-Konstruktor Problem wenn T ein und a = b; Zuweisung Klassenobjekt müssen ist? b = tmp ; für Typ T definiert sein! Referenzen oder Pointer werden hier nicht unterstützt Compiler erzeugt erst hier Code für Funktion swap mit Aktual- Parametertyp int und deren Aufruf. Hier wird Funktion swap mit Aktual-Parametertyp double gemäß Schablone erneut compiliert. Fehler: Compiler verlangt hier gleiche Typen, weil auch die Proxy- Typen gleich sind (Kein autom. impliziter Type-Cast bei Templates). 20.06.08 C++ Funktions-Templates 3

Überladene Funktionstemplates Für Aktual-Parameter von Template-Funktionen gibt es keine implizite Typumwandlung Explizite Typumwandlung wird unterstützt template <typename T> sqrt(t); void f( int i, double d, complex z) complex z1 = sqrt(i); // sqrt(int) per Deduktion complex z2 = sqrt(d); // sqrt(double) per Deduktion complex z3 = sqrt<>(i); // sqrt(int) per Deduktion complex z4 = sqrt(z); // sqrt(complex) per Deduktion Hier wird immer die zum Argumenttyp passende sqrt- Funktion generiert complex z5 = sqrt( double(i) ); // sqrt(double) per Deduktion complex z6 = sqrt<double>(i); // sqrt<double> ohne Deduktion Wird etwas anderes gewünscht, muss explizit gecastet oder deduziert werden. 20.06.08 C++ Funktions-Templates 4

Überladene Funktionstemplates Überladungsmöglichkeiten für Template-Funktionen: durch Funktion gleichen Namens durch andere Template-Funktion gleichen Namens Compiler findet die richtige Überladung in 3 Schritten: 1. Suche nach Funktion mit exakt gleicher Signatur 2. Suche nach Template-Funktion mit exakt passender Argumentliste 3. Suche nach einer überladenen Funktion, die nach einem impliziten Cast eines oder mehrere Argumente aufgerufen werden kann. template < typename T > T max(t a, T b) return a<b? b : a; void f( int a, int b, char c1, char c2 ) int m1 = max(a,b); char m2 = max(c1,c2); int m3 = max(a,c1); An dieser Fehlerstelle wird erfolglos Schritt 3 versucht. Abhilfe: template < typename T > T max(t a, T b) return a<b? b : a; int max(int a, int b) return a<b? b : a; void f( int a, int b, char c1, char c2 ) // int m3 = max(a,c1); // max(char,char) // max(int,int) // Fehler: max(int,char) kann nicht generiert werden // da keine Casts versucht werden (Schritt 2) // Jetzt OK! max(int,int) wird aufgerufen (Schritt 3) 20.06.08 C++ Funktions-Templates 5

Beispiel 2: Funktion selectionsort als Funktionstemplate //Sortieren im Bereich [from,to) void selectionsort( int a[ ], int from, int to) int i, j, min; for( i = from; i < to ; i++) min = i; for( j=i+1; j < to; j++) if( a[j] < a[min] ) min = j; swap( a[i], a[min] ); Begründung: operator< sorgt i.a: für eine aufsteigende Sortierung. Soll z.b. nach den Beträgen von int-werten sortiert werden, so ist dies mit operator< nicht möglich, ohne den Sortieralgorithmus zu ändern. Deshalb delegiert man den Entscheid über die korrekte Reihung besser an eine allgemeine Vergleichsfunktion 'compare', die Bestandteil des Elementtyps ist. Damit sind Elementtyp und Sortier-Algorithmus weitgehend entkoppelt (generische Programmierung). bool compare( const int& a, const int& b ) return a<b; bool compare( const int& a, const int& b ) return abs(a)<abs(b); //Sortieren im Bereich [from,to) template < typename T > void selectionsort( T a, int from, int to) int i, j, min; for( i = from; i < to ; i++) min = i; for( j=i+1; j < to; j++) if( a[j] < a[min] ) min = j; swap( a[i], a[min]); oder besser: An Stelle des Schlüsselworts 'typename' kann auch das 'class' verwendet werden. //Sortieren im Bereich [from,to) template < typename T > void selectionsortcompare( T a, int from, int to ) int i, j, min; for( i = from; i < to ; i++ ) min = i; for( j=i+1; j < to; j++ ) if( compare( a[j], a[min]) ) min = j; swap( a[i], a[min] ); predicate-funktion:= Funktion, die bool- Wert zurück gibt 20.06.08 C++ Funktions-Templates 6

Aufgabe 1 Implementieren Sie die Funktionen greater, compare, isinascendingorder und selectionsortcompare als Template. Zum Testen verwenden Sie die Test_Unit. bool greater(int a, int b) return b<a; bool compare( const int& a, const int& b ) return ::greater(a,b); bool isinascendingorder( int a, int from, int to ) for( int i = from+1; i<to; ++i ) if(a[i]<a[i-1]) ) return false; return true; // Test_Unit für selectionsortcompare void test_selectionsortcompare() string s("abcdefghij"); vector<char> v(s.begin(), s.end()); selectionsortcompare (v, 0, s.size()); std::reverse(v.begin(), v.end()); bool passed = isinascendingorder(v,0,v.size()); cout << "Test selectionsort : " << (passed? "passed" : "failed") << endl; 20.06.08 C++ Funktions-Templates 8

Aufgabe 2 Implementieren Sie eine Such-Funktion als Template mit folgenden Eigenschaften: Aufruf: unsigned int fundstelle = find(c, first, last, value ); Rückgabe des Index i des ersten Elements im Containers c im Bereich [first,last) für das die folgende Bedingung eingehalten wird: c[i] == value (Predicate) Rückgabe last wenn value nicht enthalten ist. Komplexität: Höchstens last - first Anwendungen der Predicate-Funktion. Testen Sie Ihre Implementierung mit der Test-Unit test_find() void test_find() string str("adam und Eva"); int SIZE = str.length(), pos; bool passed = true; if( ( pos = find( str, 0, SIZE, 'A' ) )!= 0 ) passed = false; if( ( pos = find( str, pos, SIZE, 'd' ) )!= 1 ) passed = false; if( ( pos = find( str, pos, SIZE, ' ' ) )!= 4 ) passed = false; if( ( pos = find( str, pos, SIZE, 'a' ) )!= 11 ) passed = false; if( ( pos = find( str, 0, SIZE, 'B' ) )!= SIZE ) passed = false; cout << "test_find : " << (passed? "passed" : "failed") << endl; return; 20.06.08 C++ Funktions-Templates 9

Aufgabe 2 - Lösung 20.06.08 C++ Funktions-Templates 10

Aufgabe 3 (Hausaufgabe) Implementieren Sie die Funktion max als Template und schreiben Sie eine TestUnit, die Time-Objekte verwendet. Typ& max( Typ, Typ ); 20.06.08 C++ Funktions-Templates 11