Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Tutorium Software-Engineering SS14 Florian Manghofer.

Ähnliche Präsentationen


Präsentation zum Thema: "Tutorium Software-Engineering SS14 Florian Manghofer."—  Präsentation transkript:

1 Tutorium Software-Engineering SS14 Florian Manghofer

2 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

3 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.

4 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

5 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.

6 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; }

7 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.

8 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

9 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

10 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.

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

12 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.


Herunterladen ppt "Tutorium Software-Engineering SS14 Florian Manghofer."

Ähnliche Präsentationen


Google-Anzeigen