Tutorium Software-Engineering SS14 Florian Manghofer.

Slides:



Advertisements
Ähnliche Präsentationen
1 Funktionstemplates Einbinden von Templates: –Eine *.o Datei, die durch Übersetzen einer Datei nur mit Templates erzeugt wurde, enthält keinen Programmcode.
Advertisements

Abstrakte Klassen Basisklassen sollten in der Regel sehr allgemein sein. Oft ist es nicht notwendig, dass Objekte dieser generellen Basisklassen angelegt.
Objektorientierte Programmierung
DVG Einfache Klassen Einfache Klassen. DVG Einfache Klassen 2 Strukturen Beispiel: Personendaten bestehen aus –String name –String vorname.
Definition von Klassen in Java
Progwerkstatt JAVA Klasse, Objekte, Konstruktoren, Methoden
Java: Objektorientierte Programmierung
Java: Dynamische Datentypen
Indirekte Adressierung
Java: Referenzen und Zeichenketten
Java: Grundlagen der Objektorientierung
Datentyp- umwandlung. Literale sind: Bezeichner mit einem festen Wert wie z.B:
Klassenvariable (auch Klassendaten bzw. statische Attribute genannt) und statische Methoden.
Klassenvariable. Da man für jede Kuh bzw. jede Henne auf dem Markt den gleichen Preis für ein Liter Milch, bzw. den gleichen Preis für ein Ei bekommt,
Konstruktoren.
Polymorphie (Vielgestaltigkeit)
Objekte und Arbeitsspeicher
Interface bzw. Schnittstelle anschaulich: Hüllenklasse
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Einführung in die Programmierung mit Java
Java-Kurs - 2. Übung Entwicklungsumgebung Struktur von Programmen
Programmieren mit JAVA
Programmieren mit JAVA
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
Zusammenfassung Vorwoche
Abstrakter Datentyp in C++ I - Klasse -
Objektorientierte Programmierung
DVG Einführung in Java1 Einführung in JAVA.
DVG Klassen und Objekte
DVG Einfache Klassen 1 Einfache Klassen. 2DVG Einfache KlassenStrukturen Beispiel: Personendaten bestehen aus String name String name.
Seite 1 Interface - Konzept Ein Interface führt einen neuen Datentyp ein: interface Frau {... } Das Interface enthält Deklarationen ( keine Definitionen.
Einführung in die Programmierung Wintersemester 2013/14 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2011/12 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Dynamische Datentypen
Variablen in Programmiersprachen
Übersicht Nachtrag zu Ausdrücken
Einführung in die Programmierung mit Java
Java-Kurs - 5. Übung Besprechung der Übungsaufgabe Klassen und Objekte
Einführung in die Programmierung mit Java
Vererbung. Klassen - Vererbung  Eine Klasse kann von einer Basisklasse abgeleitet werden  Die abgeleitete Klasse erbt die Eigenschaften und Methoden.
Pointer. Precompiled Header  Vorübersetzung eingebundener Dateien häufig genutzt, selten geändert  Projekttyp „Win32 Console Application“
Tutorium Software-Engineering SS14 Florian Manghofer.
Java Programme nur ein bisschen objektorientiert.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Dr. Wolfram Amme, Generisches Programmieren, Informatik II, FSU Jena, SS Generisches Programmieren.
Tutorium Software-Engineering SS14 Florian Manghofer.
C++ FÜR cOMPUTERSPIELENTWICKLER
Tutorium Software-Engineering SS14 Florian Manghofer.
Tutorium Software-Engineering SS14 Florian Manghofer.
Funktionen (Zweck und Eigenschaften) Funktionen sind Unterprogramme, die einen bestimmten Zweck erfüllen Sie zerlegen Probleme in kleine, abgeschlossene.
Operator Overloading, Mehrfachvererbung, Safe Pointer, Observer.
Singletons, Exceptions und (s)printf. Template Klassen  äquivalent zu Template-Funktionen  beim Erzeugen von Instanzen muss der Typ angegeben werden.
Tutorium Software-Engineering SS14 Florian Manghofer.
Einführung in die Programmierung
Einführung in die Programmierung
Grundkurs Informatik 11-13
Polymorphie Überladen
Einführung in die Programmierung
«Delegierter» Methoden Schablone Funktionszeiger
1. Die rekursive Datenstruktur Liste 1
9. Vererbung und Polymorphie
Implementieren von Klassen
 Präsentation transkript:

Tutorium Software-Engineering SS14 Florian Manghofer

Das Ziel, das man mit dem Einsatz von standardisierten Vorlagen verfolgt, ist den Aufwand bei der Programmentwicklung zu reduzieren, da nicht alle Programmteile neu erfunden und selbst entwickelt werden müssen. Auch beim Bau eines neuen Autos wird das Rad nicht jedes Mal neu erfunden. Man wird feststellen, dass sich auch in einem höchst individuellen Programm viele allgemein gültige generelle Konzepte wiederfinden. Diese generellen Konzepte kann man durch passende „Schablonen“ einmalig vorfertigen und dann entsprechend modifiziert in den eigenen Programmen immer wieder verwenden. Derartige Programmschablonen werden in C++ Template genannt. C++ Templates sind Programmtextvorlagen, die einen oder mehrere Platzhalter besitzen, die in der Vorlage noch nicht näher bestimmt werden. Erst wenn aus der Vorlage Programmcode generiert wird, werden die Platzhalter mit konkretem Inhalt versehen. Dadurch kann eine generelle Vorlage an die jeweiligen Bedürfnisse der Programmumgebung angepasst werden. Das Besondere an C++ Templates ist, dass Platzhalter auch für Datentypen eingesetzt werden können. Damit kann eine Klasse oder eine Funktion unabhängig von speziellen Datentypen erstellt werden. Man bezeichnet diese Art der Programmierung, die nicht an bestimmte Datentypen gebunden ist, als generische Programmierung. C++ kennt zwei Arten von Templates: Funktions-Templates für generische oder parametrisierte Funktionen Klasse-Templates für generische oder parametrisierte Klassen Templates

Funktionstemplates: Bilden eine allgemeine Schablone für eine Funktion. Ziel: Die Funktion wird unabhängig vom Datentyp. Beispiele: sortieren (siehe Skript) suchen. Eine Funktion suchen müssten wir für jeden Datentyp extra implementieren: int suchen(int[],int); int suchen(string[], string); int suchen(float[], float); usw. Der Inhalt bzw. die Funktionsweise der Funktion ändert sich nicht, nur jeweils der Datentyp der Parameter...redundanter Code. Wenn man nun diese suchen Funktion vom Datentyp der Parameter abkoppelt, braucht man nur noch diese eine Funktion, das Template, und sie funktioniert für alle Datentypen.

Templates Syntax Funktionstemplates: template Rückgabetyp name(Parameter T, …); //Prototyp Es können auch mehrere Parameter in <> stehen. template int suchen(T[], int laenge, T);//Prototyp template int suchen(T feld[], int laenge, T wert){ int i = 0; int gefunden = -1; while(i<laenge){ if(feld[i] == wert){ gefunden = i; i = laenge; } i++; } return gefunden; } Beispiel Funktionstemplate suchen:

Templates Instanzierung: 3 Möglichkeiten: 1. Beim erstmaligen Aufruf der Funktion leitet der Compiler aus den Typen der Funktionsparameter die nötigen Template-Parameter ab, setzt diese in die Platzhalter des Templates ein und generiert dann den vollständigen Code. 2. Ebenfalls beim erstmaligen Aufruf, aber hier werden die Template-Parameter vom Programmierer angegeben. 3. Durch explizite Deklaration mit entsprechenden Parametern (= explizite Instanzierung) wird die nötige Code-Generierung auch ohne Aufruf der Funktion angestoßen.

Templates Instanzierung: Beispiel Funktionstemplate suchen: int main(){ int feld[] = {1,2,3,4,5,6};//laenge = 6 int gefunden; gefunden = suchen(feld,6,3);//Aufruf/Instanzierung nach 1. Möglichkeit string myfeld[] = {„Max“,“Peter“,“Franz“,“Fritz“}; //laenge = 4 gefunden = suchen (myfeld,4,“Peter“); // 3. Möglichkeit return 1; }

Templates Klassentemplates: Gleiches Prinzip wie bei Funktionen. Es gibt auch für Klassen Schablonen. //Definition eines Klassen-Templates: template class KlassenName { //……. }; Standardargumente sind erlaubt: Typ-Parameter: …., class T2 = double, ….. Wert-Parameter: …... int bez1 = 10, …… Ein Typ-Parameter kann nur dann vorbesetzt werden, wenn alle nachfolgenden Typ- Parameter in der Liste ebenfalls vorbesetzt sind. Die Typen von Wert-Parametern sind auf ganzzahlige Typen beschränkt. Auch sie können vorbesetzt werden. Wert-Parameter dienen dazu, um beim Instanzieren einer Klasse einen konstanten Wert in die Klassendefinition einzubringen. Sie können nicht verändert oder referenziert werden. Elementfunktionen, die außerhalb der Klassendefinition definiert werden, sind automatisch Template-Funktionen mit den gleichen Parametern und müssen entsprechend formuliert werden.

Templates Klassentemplates: Das geht z.B. nicht: //Definition einer Klassen-Template: template class KlassenName { //……. }; 2 Fehler: T1 ist zwar vorbesetzt, aber T2 nicht  funktioniert nicht bez1 ist mit einer Gleitkommazahl vorbesetzt  funktioniert nicht

Templates Klassentemplates Beispiel: template //D als Ergebnisdatentyp für Division class Rechner{ private: T operand1; E operand2; public: Rechner(T erster, E zweiter): operand1(erster), operand2(zweiter){}; T addiere(); //Prototyp, Definition außerhalb der Klasse D teile(){//Definition innerhalb der Klasse D ergebnis = (D)(operand1) / operand2; //cast wegen Kommastellen return ergebnis; } }; template T Rechner ::addiere(){ return operand1+operand2; } Würden wir hier nicht casten, hätten wir bei int/float ein Problem und würden Kommastellen verlieren

Templates Klassentemplates Beispiel: int main(){ Rechner rechner(4,5); //explizite Instanzierung cout << rechner.addiere() << endl; Rechner myrechner(1,0.5); //wir wollen al Ergebnisdatentyp der Divison cout << myrechner.teile() << endl; //den Datentyp float erhalten return 1; } Wir können hier nicht implizit Insatnzieren (ohne die ), weil wir für den Platzhalter D keinen Wert übergeben, und somit der Compiler nicht weiß, welchen Typ er zuweisen soll.

Templates Klassentemplates Beispiel (mit Klasse Komplex aus Kapitel Operatoren überladen): template class Rechner{ private: T eins; T zwei; public: T addiere(){ return eins + zwei; } };

Templates Klassentemplates Beispiel (mit Klasse Komplex aus Kapitel Operatoren überladen): int main(){ Rechner rechner(); cout << rechner.addiere(3,4) << endl;//Ausgabe 7 Komplex k1(2,4); Komplex k2(6,8); Rechner komplexRechner(); cout << komplexRechner.addiere(k1,k2) << endl; //Ausgabe i return 1; } Unsere Rechnerklasse bzw. Klassentemplate funktioniert für int Werte ebenso wie für Objekte vom Typ Komplex. Sinn dieser Klassentemplates. Denn egal welcher Typ, die Funktionalität von Rechner bleibt die gleiche!!! Die Methode addieren funktioniert, weil wir das + für den Typ Komplex überschrieben haben. Ebenso funktioniert <<, weil wir dies Ebenso für Komplex überschrieben haben.