HSR Rapperswil 2001 Markus Rigling. Programmieren: Templates Auflage

Ähnliche Dokumente
Prof. W. Henrich Seite 1

Ziel, Inhalt. Programmieren in C++ Wir lernen wie man Funktionen oder Klassen einmal schreibt, so dass sie für verschiedene Datentypen verwendbar sind

Aufbau von Klassen. class punkt {...

Programmieren - C++ Funktions-Templates

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

Angewandte Mathematik und Programmierung

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Vorkurs C++ Programmierung

Einstieg in die Informatik mit Java

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

Repetitorium Informatik (Java)

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

Überladen von Operatoren

Programmieren in C++ Überladen von Methoden und Operatoren

Kurzeinführung in C/C++ Elementare Datentypen in C++

Java Vererbung. Inhalt

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

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

1 Polymorphie (Vielgestaltigkeit)

Objektorientierte Programmierung mit C++ SS 2007

Meeting C++ C++11 R-Value Referenzen

Objekt-Orientierte Programmierung

10. Klassen. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Konstruktoren und Destruktoren Initialisierung von Objekten

3D Programmierpraktikum: Einführung in C++ - Teil 2

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

Klassenbeziehungen & Vererbung

Klausur C++ #1 Jahr: 2001; Dozent: Dipl.Ing. Sorber

Informationsverarbeitung im Bauwesen

Methoden (fortgeschritten) in C# - 1

Abend 7 Vererbung und Polymorphie, Abstrakte Klassen

12. Vererbung. Prof. Dr. Markus Gross Informatik I für D-ITET (WS 03/04)

Zählen von Objekten einer bestimmten Klasse

Java Einführung Methoden in Klassen

Java Einführung Methoden. Kapitel 6

Einführung in die C-Programmierung

13. Vererbung. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

OOP und Angewandte Mathematik. Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

Objektorientierte Programmierung mit C++ Vector und List

Beziehungen zwischen Objekten

einkonto.zahle(+100); //Transaktion Einzahlung einkonto.zahle(-20); //Transaktion Auszahlung einkonto.zahle(+30); //Transaktion Einzahlung

C++-Zusammenfassung. H. Schaudt. August 18, 2005

Java - Überladen von Methoden und Konstruktoren

(allgemeine) OOP in C++ Klassen und header-files Konstruktorn / Destruktoren Speicherverwaltung C++ Standard Library / SLT

Javakurs für Anfänger

Einführung in die Programmierung 1

Der Operator this. Wir betrachten nochmals die Klassendefinition von Ballon.

Unterprogramme. Funktionen. Bedeutung von Funktionen in C++ Definition einer Funktion. Definition einer Prozedur

C++-Entwicklung mit Linux

Verwendung von Klassen in C++

AuD-Tafelübung T-B5b

Programmieren in C. Macros, Funktionen und modulare Programmstruktur. Prof. Dr. Nikolaus Wulff

Klausurvorbereitung Lösung

Objektorientierung: Klassen und Objekte

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Programmierung mit C Zeiger

C++ - Eine Ubersicht fur Java-Programmierer

Deklarationen in C. Prof. Dr. Margarita Esponda

Pass by Value Pass by Reference Defaults, Overloading, variable Parameteranzahl

Java I Vorlesung Vererbung und Sichtbarkeit

7 Vererbung. Modul Programmieren mit C++ Kapitel Vererbung

Probeklausur: Programmierung WS04/05

Vorlesung Datenstrukturen

3 Objektorientierte Konzepte in Java

Objektorientierte Programmierung mit Java. Grundlagen Übersicht. Programmiersprachen

1.4. Funktionen. Objektorientierte Programmierung mit C++

Dr. Monika Meiler. Inhalt

Interaktionen zwischen Objekten durch Senden von Nachrichten und Reagieren auf empfangene Nachrichten

Java Einführung Klassendefinitionen

Erste Schritte der Programmierung in C

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Einführung in C++ mit Microsoft VS

Alltagsnotizen eines Softwareentwicklers

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Einführung in C++ Operatoren überladen (Klassen)

3. Auflage. O Reillys Taschenbibliothek. C# 5.0 kurz & gut. Joseph Albahari & Ben Albahari O REILLY. Aktualisierung von Lars Schulten

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

Klassen mit Instanzmethoden

Die abgeleiteten Klassen Kreis und Viereck erben die Elemente des Basisklasse und verfügen über zusätzliche Eigenschaften (Seitenlänge,

Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Programmieren II Klassen. Zur Erinnerung.

C++ - Einführung in die Programmiersprache Objektorientierte Programmierung

GI Vektoren

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 4

11. Klassen. Prof. Dr. François E. Cellier Informatik I für D-ITET (HS 2012)

Programmentwicklung mit C++ (unter Unix/Linux)

Klausur C-Programmierung / / Klingebiel / 60 Minuten / 60 Punkte

Java: Vererbung. Teil 3: super()

Algorithmen und Programmierung II

Einführung in die STL

Inhaltsverzeichnis. Heiko Kalista. C++ für Spieleprogrammierer ISBN: Weitere Informationen oder Bestellungen unter

Programmierkurs Java

Systemnahe Programmierung in C/C++

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Prinzipien Objektorientierter Programmierung

Übersicht. Vorstellung des OO-Paradigmas

1. Übung zu "Numerik partieller Differentialgleichungen"

Transkript:

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.. 4 4. Friend. 5 5. Deklaration Templateklasse 6 6. Definition Templateklasse 7 7. Benutzung einer Templateklasse in main(). 7 8. Instantiierung 8 9. Klassenattribute static.. 8 10. Argumente von Klassentemplates 9 11. Klassentemplates mit Vererbung. 9 12. Funktionstemplates. 9 13. Compilieren von Templates.. 10 2 1. Auflage

1. Verwendung Zum Beispiel bei einer Containerklasse. Containerklassen werden oft benötigt. Sie beinhalten char, int, Student und viele weitere Möglichkeiten. Anstatt den selben Quellcode, in dem char zu int usw. geändert wird, immer wieder von neuem zu schreiben, ist es einfacher, ein Template zu erstellen und jeweils anzugeben, für welchen Datentyp diese Implementierung gelten soll. 2. Erstellen einer Templateklasse Im Quellcode wird der entsprechende Datentyp, der variabel werden sollte, durch das Schlüsselwort Type im Header-File und im Source-File(.cpp) ersetzt (könnte auch ein anderer unverkennbarer Name sein, z.b. T). Im Header sollte vor der Klassendeklaration der Eintrag enthalten sein (ohne ; am Schluss). #ifndef STACKT_H #define STACKT_H //ist Deklaration eines Templates class Stack public: Stack( int size = defaultsize ); //Konstruktor Stack( const Stack<Type>& einstack ); //Kopierkonstruktor ~Stack(); //Destruktor void push( Type c); Type pop(); int size() const; private: Type* data; const int maxlength; ; #endif Type kann durch einen beliebigen Datentyp (auch Klassen) ersetzt werden. Besondere Beachtung ist auch dem Kopierkonstruktor zu schenken mit der Silbe const Stack<Type>&. Bei der Angabe der Länge (size) des Stacks wird für jedes Datenformat ein Ganzzahlwert gebraucht. Diese Variable ist daher nicht abhängig davon, welches Datenformat / welche Klasse die Klasse Stack beinhaltet. Darum bleibt der Datentyp int. In der Definition muss vor jeder Methode vorangesetzt werden, damit der Compiler Type als Parameter erkennt. Ausserdem ist der Name der parametrisierten Klasse Stack<Type>, daher ist dies vor dem Sichtbarkeitsoperator :: anzugeben. 3 1. Auflage

#include stack.h Stack<Type>::Stack( int size ) //Konstruktor : max length( size ), topindex( emptyindex ) data = new Type[size]; Stack<Type>::~Stack() delete [] data; //Destruktor In main() kann dann folgendermassen auf die Template-Klasse zugegriffen werden: void main() int i = 0; char eintext[] = Das ist ein Text ; Stack<char> charstack1; charstack1.reset(); //Ruft reset-funktion von Stack auf Stack<float> floatstack1; Die Verwendung der Objekte erfolgt wie bei normalen Objekten: die Methoden werden normal benutzt, wobei Parametertypen und Rückgabetypen nun ebenfalls statt Type z.b. char enthalten. 3. Faustregel zum Erstellen eines Klassentemplates Normale Klasse mit irgendeinem Datentyp schreiben, der später durch den Templateparameter ersetzt werden soll und Klasse gründlich testen Datentyp durch Type ersetzen Der Klassendeklaration und jeder Methodendefinition voranstellen Klassenname durch Klassenname<Type> ersetzen: überall, ausser beim Namen der Konstruktoren und des Destruktors Also beim Kopierkonstruktor: Klassenname( const Klassenname<Type>& X); Vor Klassenname kein Type, jedoch in Argumentliste, da ich ja ein Type- Objekt kopieren will. 4 1. Auflage

4. Friend Klassentemplates können auch friends enthalten. Es sind hier zwei Fälle zu unterscheiden: Der Friend enthält den Typparameter nicht: - d.h. eine Funktion oder eine Klasse wird als friend deklariert - sie ist unabhängig vom Typparameter, dann ist die Funktion oder die Klasse friend von allen Instantiierungen des Templates. der Friend enthält den Typparameter: - d.h. eine Funktion oder eine Klasse wird als friend deklariert - sie ist abhängig vom Typparameter, d.h. - die friend-funktion hat Parameter des Typs oder den Typ als Rückgabetyp - die friend-klasse ist mit diesem Typ ebenfalls parametrisiert, dann ist die Funktion oder die Klasse nur friend einer Instatiierung des Templates. Beispiel: class VektorIterator; //Vorwärtsdeklaration VektorIterator class Vektor public: private: friend VektorIterator<Type> ; Vektor<Type> operator*( Type x, const Vektor<Type>& v ); //geht auch bei Funktion class VektorIterator public: ; #endif 5 1. Auflage

5. Deklaration Templateklasse Was muss bei der Umschreibung einer Klasse in ein Template in der Deklaration geändert werden? den Klassendeklarationen wurde vorangestellt der variable (zu ändernde) Datentyp wurde überall in Type geändert die Klassennamen wurden in Vektor<Type> bzw. VektorIterator<Type> geändert, ausser bei class Vektor und bei den Namen von Konstruktoren und Destruktoren VektorIterator wird friend von Vektor class VektorIterator; //Vorwärtsdeklaration class Vektor public: Vektor( int n = 10 ); //Konstruktor (ohne <Type>) Vektor( const Vektor<Type>& v ); //Copy-Konstruktor Type& operator[]( int i ); void print( ostream& out) const; private: friend VektorItearator<Type>; int length; Type* p; ; Vektor<Type> operator*( Type x, const Vektor<Type>& v ); class VektorIterator public: VektorIterator( Vektor<Type>& v ); private: Vektor<Type>& vr; ; 6 1. Auflage

6. Definition Templateklasse Was muss bei der Umschreibung einer Klasse in ein Template in der Definition geändert werden? den Methodendefinitionen wurde vorangestellt der variable (zu ändernde) Datentyp wurde überall in Type geändert die Klassennamen wurden in Vektor<Type> bzw. VektorIterator<Type> geändert, ausser bei den Namen von Konstruktoren und Destruktoren #include vektor.h //Templateklasse includen VektorIterator<Type>::VektorIterator(Vektor<Type>& v) : vr( v ), index( 0 ) template yclass Type> void VektorIterator<Type>::first() index = 0; 7. Benutzung einer Templateklasse in main() In folgenden Beispiel wird ein Vektor von float instantiiert, zur Iteration wird ein VektorIterator mit float instantiiert. void main() float feld[12] = 1.1, ; Vektor<float> v( feld, 5); //Instantiierung mit float cout << v; for( VektorIterator<float> vi( v);!vi.done(); vi.next() ) vi.current() = 111.1; cout << v; 7 1. Auflage

8. Instantiierung Eine Template-Definition führt alleine noch nicht zu lauffähigem Programmcode. Der Compiler generiert erst für jeden konkreten Parametersatz (z.b. float, int etc.) eine spezifische Instanz der Template-Funktion. Das heisst, dass er die Template-Klasse erst dann durch den gewählten Datentyp generiert. Eine Instanzierung kann auf drei Arten erfolgen: 1. Beim erstmaligen Aufruf der Funktion leitet der Compiler aus den Typen der Funktionsparameter die nötigen Templateparameter ab, setzt diese in die Platzhalter des Templates ein und gneriert dann den vollständigen Code. 2. Ebenfalls beim erstmaligen Aufruf, aber hier werden die Templateparmeter vom Programierer angegeben. 3. Durch explizite Deklaration mit entsprechenden Parametern wird die nötige Code- Generierung auch ohne Aufruf der Funktion angestossen. 9. Klassenattribute static Klassenattribute haben bekanntlich für alle Objekte einer Klasse nur einen Wert. Bei Klassenattributen von Klassentemplates gilt folgende Besonderheit: Klassenattribute von Klassentemplates haben für jede Instantiierung einen Wert. Das mit static versehene Argument gilt also für alle Objekte, die in der aus der Templateklasse generierte Klasse enthalten sind. Beispiel: class Vektor private: static int anzahlderobjekte; ; int Vektor<Type>::anzahlDerObjekte = 0; //initialisieren des statischen Attributs Vektor<float> v; //Instantiierung mit float Vektor<int> v; //Instantiierung mit int Dieses Beispiel enthält also zwei statische Variablen, die unabhängig von einander sind. 8 1. Auflage

??? 10. Argumente von Klassentemplates 11. Klassentemplates mit Vererbung Klassentemplates können auch zusammen mit Vererbung eingesetzt werden: Klassentemplates können Spezialisierungen von normalen Klassen sein, Klassentemplates können Spezialisierungen von anderen Klassentemplates sein normale Klassen können Spezialisierungen von Instantiierungen von Klassentemplates sein ev. Beispiele aus Dummies 12. Funktionstemplates Ein ähnliches Problem wie bei den Klassen (welches Problem / wo?) tritt auch bei Funktionen auf: wenn wir Funktionen für verschiedene Datentypen ihrer Parameter überladen, so ist häufig der Code gleich. Der einzige Unterschied besteht im Datentyp der Parameter und evt. internen Variablen. Sie sind so aufgebaut: template<class Type> void feldcopy( Type a[], Type b[], int n ) Im Unterschied zu Klassentemplates werden die Funktionstemplates vom Compiler automatisch bentzt. Der Compiler sucht bei einem Funktionsaufruf die pasende Funktion nach folgender Regel: 1. Falls eine normale Funktion vorhanden ist, die mit ihrem Datentypen exakt passt, wird diese verwendet 2. Falls ein Funktionstemplate vorhanden ist, das bei Ersatz des / der Typparameter durch reale Typen exakt passt, wird dies verwendet 3. Ansonsten wird nach den üblichen Regeln mit Typkonversionen nach einer normalen Funktion gesucht Beispiel anhand einer Funktion swap, die die Werte ihrer beiden Argumente vertauscht: template<class Type> void swap( Type& x, Type& y ) 9 1. Auflage

Type temp ; temp = x ; x = y ; y = temp ; Die Funktion swap kann für alle eingebauten und selbstdefinierten Datentypen benutzt werden, falls bei diesen die gebrauchten Operatoren definiert sind. Die Funktion kann aber nicht für Felder benutzt werden. Falls dies doch erforderlich ist, muss die Funktion auch für Felder umgesetzt werden. Ein weiteres Template ist nicht möglich. In diesem Beispiel wird die zusätzliche Funktion für ein Feld von char umgesetzt: void swap( char s1[], char s2[] ) int maxlen; if( strlen(s1) > strlen(s2) ) maxlen = strlen(s1); else maxlen = strlen(s2); char* temp = new char[maxlen + 1]; //+1 ist nötig wegen \0 strcpy( temp, s1 ); strcpy( s1, s2 ); strcpy( s2, temp ); delete[] temp; 13. Compilieren von Templates Der Compiler stellt erst beim Linken fest, dass eine bestimmte Instantiierung eines Templates benötigt wird. Er muss diese dann herstellen und compilieren, bivor er mit dem Linken fortfahren kann. Sorgfältiges Studium der Dokumentation zum Compiler ist daher erforderlich, wenn das Übersetzen von Programmen mit Templates nicht auf Anhieb gelingt. Die vom Compiler herausgegebenen Fehler sind dabei vielmals nur indirekt ein Hinweis auf den Programmierfehler. 10 1. Auflage