Grundkurs C++ IDE Klassenhierarchien

Ähnliche Dokumente
Vorkurs C++ Programmierung

Objektorientierung: Klassen und Objekte

Angewandte Mathematik und Programmierung

C++ - Einführung in die Programmiersprache Polymorphismus und Vererbung. Eltern

Codingstandard. Softwareentwicklung Praktikum Stand:

Programmieren - Vererbung & Polymorphie

3 Objektorientierte Konzepte in Java

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

Wintersemester Maschinenbau und Kunststofftechnik. Informatik. Tobias Wolf Seite 1 von 22

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

Programmieren in Java

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

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

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

Objektorientierte Programmierung mit C++ Vector und List

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

Angewandte Mathematik und Programmierung

Vererbung & Schnittstellen in C#

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

C vs. C++ Sebastian Meyer. Proseminar C - Grundlagen und Konzepte. Universität Hamburg

1. Grundlegende Eigenscha5en 2. Redefini+on 3. Polymophie 4. Mehrfachvererbung

1. Von der Idee zur Software 2. Funktionen und Datenstrukturen Lehrbuch: Organisation des Quellcodes 4. Werte- und Referenzsemantik

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

Objektorientierte Programmierung

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

GetName(), GetName(), GetGeschlecht() und AelterWerden().

Von der UML nach C++

Einführung in C++ mit Microsoft VS

1 Polymorphie (Vielgestaltigkeit)

Objektorientiertes Programmieren für Ingenieure

Klassenbeziehungen & Vererbung

Objektorientierte Programmierung mit C++ Zusammenfassung der wichtigsten Topics rund um die objektorientierte Programmierung mit C++11

C++ Kurs Teil 1. Architektur, Anwendungsspektrum, primitive Datentypen, Funktionsaufrufe, Referenzen, Klassen

Vorlesung Informatik II

3 Objektorientierte Konzepte in Java

Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Programmieren II Vererbung. Einleitende Bemerkungen

Praktikum Betriebssysteme 1. Aufgabe (1)

Teil 9: Vererbung. Prof. Dr. Herbert Fischer Fachhochschule Deggendorf Prof. Dr. Manfred Beham Fachhochschule Amberg-Weiden

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

Ulla Kirch Peter Prinz C+ + Lernen und professionell anwenden. mitp

Probeklausur: Programmierung WS04/05

Programmierkurs Java

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

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

5.4 Klassen und Objekte

Funktionen Häufig müssen bestimmte Operationen in einem Programm mehrmals ausgeführt werden. Schlechte Lösung: Gute Lösung:

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

Javakurs für Anfänger

C/C++-Programmierung

Algorithmen und Datenstrukturen

Java Schulung (Java 2 Java Development Kit 5 / 6)

C++ - Funktionen und mehr. Kerstin Gößner und Ralf Wondratschek

Alltagsnotizen eines Softwareentwicklers

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

Kapitel 6. Vererbung

Test zu Grundlagen der Programmierung Leitung: Michael Hahsler. 21. November 2003

Kapitel 6. Vererbung

Klausur zu Objektorientierter Softwareentwicklung in C++ 4. Februar 2003 (WS 2002/2003) Beispiellösung

Repetitorium Informatik (Java)

4. Objektorientierte Programmierung mit C++

Algorithmen und Datenstrukturen 07

Javakurs 2013 Objektorientierung

Widmung Einleitung Vorwort 15 Übersicht zu diesem Buch Einführung in die Welt der Objektorientierung... 21

C++ Programmierung. Uwe Naumann. LuFG Informatik 12, RWTH Aachen University, Germany

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

Java Einführung Methoden in Klassen

Vererbung und Polymorphismus

3. Konzepte der objektorientierten Programmierung

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Abschnitt 9: Schnittstellen: Interfaces

1. Übung zu "Numerik partieller Differentialgleichungen"

Der C++ Crashkurs v1.0

Einführung in die. objektorientierte Programmierung

Technische Infor matik 2 C/C++-Kurs. Datenabstraktion (Klassen) 2005 AG Rechner netze 4.1

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

Objektorientierte Programmierung mit Python Polymorphismus und Vererbung. Eltern

Eine Klasse beschreibt Objekte mit gleichen Attributen und Methoden.

Datenbankanwendungsprogrammierung Crashkurs Java

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

Praxisorientierte Einführung in C++ Lektion: "Exceptions"

PIWIN I. Praktische Informatik für Wirtschaftsmathematiker, Ingenieure und Naturwissenschaftler I. Vorlesung 3 SWS WS 2008/2009

C# 2000 Expression Beispielcodes für Konsolen- und Formularanwendung

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Propädeutikum. Dipl.-Inf. Frank Güttler

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

5.6 Vererbung. Vererbung

9. Vererbung und Polymorphismus

Objektbasierte Entwicklung

Klausur in Programmieren

In der Computersprache C ist die Standardmethode zur Behandlung von Matrizen durch

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

Einführung in die Programmierung mit C++

Java: Vererbung. Teil 3: super()

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

Objects First With Java A Practical Introduction Using BlueJ. Mehr über Vererbung. Exploring polymorphism 1.0

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9

Java Kurs für Anfänger Einheit 5 Methoden

Folge 18 - Vererbung

Einführung in die C++ Programmierung für Ingenieure

Transkript:

Grundkurs C++ IDE Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016 Folie 1/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

IDE Integrated Development Environment Wir empfehlen: Qt Creator (Bestandteil des Qt SDK) Download unter: http://www.qt.io/download-open-source/ Bei Problemen: Bitte nicht zögern, die Tutoren zu fragen! Ausführliche Dokumentation unter http://doc.qt.io/ Folie 2/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Namensbereiche (namespaces) Vermeidung von Mehrdeutigkeiten Klassen und Variablen werden zu logischen Paketen zusammengefasst Deklaration/Erweiterung an verschiedenen Stellen in mehreren Dateien möglich namespace mynamespace Einbinden eines Namenbereichs ist global, innerhalb eines Namensbereichs, innerhalb einer Funktion möglich using namespace mynamespace; Einbeziehen einzelner Bestandteile eines Namensbereichs mit Bereichszugriffsoperator möglich mynamespace::fkt1(); Einbinden eines einzelnen Elements: using namespace mynamespace::fkt1(); Folie 4/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Implementierung einer einfachen Klasse Quadrat -m_laenge: double +setlaenge(laenge: double) +getlaenge(): double Folie 5/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

// Quadrat.h #ifndef QUADRAT_H #define QUADRAT_H class Quadrat { Quadrat(); // Konstruktor void setlaenge(double laenge); // Methode, // nur Deklaration double getlaenge() const; double m_laenge; // Attribut #endif Folie 6/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

// Quadrat.cpp #include "Quadrat.h" // Implementierung der Funktion setlaenge void Quadrat::setLaenge (double laenge) { m_laenge = laenge; double Quadrat::getLaenge() const { return m_laenge; Folie 7/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

// main.cpp #include "Quadrat.h" int main () { Quadrat meinquadrat; // Quadratobjekt erstellen Quadrat* meinquadratzeiger; // Zeiger auf Quadratobjekt double laenge; meinquadratzeiger = &meinquadrat; // Zeigeradresse setzen meinquadrat.setlaenge(25.0); // Methode des Objekts aufrufen laenge = meinquadratzeiger->getlaenge(); // Methode über // Zeiger aufrufen return 0; Folie 8/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Zugriffsregelung und Vererbung Quadrat -m_laenge: double Rechteck -m_breite: double +setlaenge(laenge: double) +getlaenge(): double +setbreite(breite: double) +getbreite(): double Folie 9/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

class Quadrat { void setlaenge(double laenge); // Methode, nur Deklaration double getlaenge () const { // Methode mit Definition return m_laenge; int m_laenge; // Attribut class Rechteck : public Quadrat { // Vererbung der Klasse Quadrat void setbreite(double breite); double getbreite () const { return m_breite; double m_breite; Folie 10/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Zugriffsregelungen bei Ableitung: public AK : public BK { Basisklasse public protected private abgeleitete Klasse public protected private Zugriff kann nur über Methoden der Basisklasse erfolgen! Folie 11/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Zugriffsregelungen bei Ableitung: protected AK : protected BK { Basisklasse public protected private abgeleitete Klasse protected protected private Zugriff kann nur über Methoden der Basisklasse erfolgen! Folie 12/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Zugriffsregelungen bei Ableitung: private AK : private BK { AK : BK { Standard! Basisklasse public protected private abgeleitete Klasse private private private Zugriff kann nur über Methoden der Basisklasse erfolgen! Folie 13/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

new und delete // main.cpp #include "Quadrat.h" int main () { Quadrat meinquadrat; // Objekt auf Stack Quadrat* meinquadratdyn; // Zeiger auf Quadrat-Objekt meinquadratdyn = new Quadrat; // neues Objekt auf // dem Heap erstellen delete meinquadratdyn; // Quadrat-Objekt löschen, // Speicher freigeben Folie 14/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Konstruktor, Destruktor und this-zeiger class A { A (int c = 1000, int d = 2000) { this->c = c; this->d = d; // Konstruktor ~A(); // Destruktor void getzustand(); int c, d; int main() { A neuesobjekt(); A neuesobjekct2(200, 300); Folie 15/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Initialisierungslisten class A { A (int k = 1000, int l = 2000) : c(k), d(l) { void getzustand(); int c; int d; Folie 16/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Konstruktor und Ableitung class A { A (int k=1, int l=2) : c(k), d(l) { std::cout << "A!" << '\n'; int c, d; class B : A { B (int m=3) : e(m) { std::cout << "B!" << '\n'; int e; int main { B b; Folie 17/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Konstruktor und Ableitung class A { A (int k=1, int l=2) : c(k), d(l) { std::cout << "A!" << '\n'; int c, d; class B : A { B (int m=3) : e(m) { std::cout << "B!" << '\n'; int e; int main { B b; Ausgabe: A! B! Abgeleitete Klasse ruft Standardkonstruktor der Basisklasse auf! Folie 17/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Aufrufreihenfolge von Konstruktoren Konstruktoren der Basisklassen(n) Konstruktoren der Elementobjekt-Klassen Konstruktoren der abgeleiteten Klasse Folie 18/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Initialisierungslisten II class A { A (int k=1, int l=2) : c(k), d(l) { std::cout << "A!" << '\n'; int c, d; class B : A { B (int m=3, int n=6, int o=9) : A(n,o), e(m) { std::cout << "B!" << '\n'; int e; expliziter Aufruf des Konstruktors der Basisklasse Reihenfolge bleibt unverändert! Folie 19/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Verdeckung class A { protected: int c, d; A() : c(1),d(2) { void getzustand(){ std::cout << "A: " << c << " " << d << "\n"; class B : A { int d; B(): d(3) { void getzustand(){ std::cout << "B: " << c << " " << d << "\n"; int main() { B b; b.getzustand();

Verdeckung class A { protected: int c, d; A() : c(1),d(2) { void getzustand(){ std::cout << "A: " << c << " " << d << "\n"; class B : A { int d; B(): d(3) { void getzustand(){ std::cout << "B: " << c << " " << d << "\n"; int main() { B b; b.getzustand(); Ausgabe: B: 1 3

Bereichszugriffsoperator class A { protected: int c, d; A() : c(1),d(2) { void getzustand(){ std::cout << "A: " << c << " " << d << "\n"; class B : A { int d; B(): d(3) { void getzustand(){ std::cout << "B: " << c << " " << A::d << "\n"; int main() { B b; b.getzustand(); Ausgabe: B: 1 2

Mehrfachvererbung class A { A(int x=1000, int y=2000): i(x), j(y) { cout << "A (constr.): i=" << i << ", j=" << j << "\n"; void getzustand() { cout << "A: i=" << i << ", j=" << j << "\n"; int i, j; class B : public A { B(int x=101, int y=102, int z=103): A(x, y), k(z) { cout << "B (constr.): "; getzustand(); int k; class C : public A { C(int x=201, int y=202, int z=203): A(x, y), l(z) { cout << "C (constr.): "; getzustand(); int l; class D : public B, public C { D(int x=301, int y=302, int z=303): B(x, y), C(x+10,y+10), m(z) { int m; int main() { D instanz; Attribute der Klasse A 2 in D, unveränderte Reihenfolge der Konstruktoraufrufe

Mehrfachvererbung class A { A(int x=1000, int y=2000): i(x), j(y) { cout << "A (constr.): i=" << i << ", j=" << j << "\n"; void getzustand() { cout << "A: i=" << i << ", j=" << j << "\n"; int i, j; class B : virtual public A { B(int x=101, int y=102, int z=103): A(x, y), k(z) { cout << "B (constr.): "; getzustand(); int k; class C : virtual public A { C(int x=201, int y=202, int z=203): A(x, y), l(z) { cout << "C (constr.): "; getzustand(); int l; Attribute der Klasse A nur noch einmal in D! class D : public B, public C { D(int x=301, int y=302, int z=303): B(x, y), C(x+10,y+10), m(z) { int m; int main() { D instanz;

Konstruktoraufrufe bei virtuellen geerbten Klassen Reihenfolge der Konstruktoraufrufe: Konstruktoren der virtuellen (geerbten) Basisklasse(n) Konstruktoren der nicht-virtuellen Basisklasse(n) Konstruktoren der Elementobjekt-Klassen Konstruktoren der abgeleiteten Klasse Der Konstruktor der am weitesten abgeleiteten Klasse übernimmt die Initialisierung des virtuell geerbten Teiles der Klasse. Die anderen Aufrufe des Basisklassenkonstruktors der virtuell geerbten Klasse werden ignoriert. Folie 24/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Zeiger auf die Basisklasse class Auto { protected: int ps, zylinder; Auto(int lei, int toepf): ps(lei),zylinder(toepf) { void bremsen() { std::cout << "BREMSE..." << "\n"; class Cabrio: public Auto { int offen; Cabrio(int lei, int toepf): Auto(lei,toepf), offen(0) { void dachauf() { std::cout << "AUF!" << "\n"; offen = 1; void bremsen() { std::cout << "BREMSE Cabrio..." << "\n"; int main() { Auto *z4 = new Cabrio(215,6); z4->bremsen(); ((Cabrio*)z4)->bremsen(); ((Cabrio*)z4)->dachAuf();

Zeiger auf die Basisklasse class Auto { protected: int ps, zylinder; Auto(int lei, int toepf): ps(lei),zylinder(toepf) { void bremsen() { std::cout << "BREMSE..." << "\n"; class Cabrio: public Auto { int offen; Cabrio(int lei, int toepf): Auto(lei,toepf), offen(0) { void dachauf() { std::cout << "AUF!" << "\n"; offen = 1; void bremsen() { std::cout << "BREMSE Cabrio..." << "\n"; int main() { Auto *z4 = new Cabrio(215,6); z4->bremsen(); ((Cabrio*)z4)->bremsen(); ((Cabrio*)z4)->dachAuf(); Ausgabe: BREMSE... BREMSE Cabrio... AUF!

Zugriff durch Basisklassenzeiger int main() { Auto *parkpl[3] = { new Cabrio(215,6), new Lkw(600,16), new Jeep(400,12) Auto *auswahl = parkpl[i%3]; Jede Spezialisierung von Auto (Cabrio, Lkw, Jeep) habe eine eigene Methode bremsen() Ist der Zeiger vom Basistyp Auto, wird die Methode von Auto aufgerufen, nicht die der Spezialisierungen. Folie 26/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Polymorphismus class Auto {... virtual void bremsen() { std::cout << "BREMSE..." << "\n"; class Cabrio : public Auto {... void bremsen() { std::cout << "BREMSE Cabrio..." << "\n"; class Lkw : public Auto {... void bremsen() { std::cout << "BREMSE LKW..." << "\n"; Zeigt der Zeiger auswahl vom Typ Auto* auf ein abgeleitetes Objekt, so bestimmt nun beim Aufruf auswahl->bremsen() der Typ des Objekts, welche Variante von bremsen() zum Einsatz kommt. Dies geschieht zur Laufzeit ( late binding ). Destruktoren sollten immer virtuell angelegt werden! Folie 27/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Polymorphismus II abstrakte Klassen class Auto {... virtual void bremsen()=0; class Cabrio : public Auto {... void bremsen() { std::cout << "BREMSE Cabrio..." << "\n"; class Lkw : public Auto {... void bremsen() { std::cout << "BREMSE LKW..." << "\n"; Die Klasse Auto kann nicht instanziiert werden Abstrakte Klassen können nicht als Typ für Funktionsparameter oder Rückgabewerte verwendet werden Abgeleitete Klassen müssen die rein virtuellen Methoden neu definieren, um instanziiert werden zu können. Folie 28/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Überladen von Funktionen int wurzel (int i); float wurzel (float f); double wurzel (double f); void main () { int ia, ib; float fa, fb; ia = wurzel (ib); fa = wurzel (fb); Funktionen müssen sich in Anzahl und/oder Typ der Parameter unterscheiden, d.h. sie müssen eine andere Signatur aufweisen. Unterscheidung in Rückgabewert oder in den Namen der Parameter reicht nicht aus. Folie 29/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Überladen von Funktionen II Bei Vererbung beachten: gleichnamige Methode in der abgeleiteten Klasse verdeckt alle gleichnamigen Methoden in der Basisklasse, unabhängig von der Signatur impliziter Aufruf von Basisklassenkonstruktor nur möglich, wenn ein Standardkonstruktor (Aufruf ohne Parameter) existiert virtuelle Methoden: Virtualität nur dann, wenn die Methode in der Basisklasse und der abgeleiteten Klasse dieselbe Signatur hat; ansonsten einfache Verdeckung Folie 30/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Überladen von Funktionen class Quadrat { Quadrat ( double laenge ); Quadrat ( const Quadrat &q ); double m_laenge; char *bezeichnung; Quadrat::Quadrat ( const Quadrat &q ) { m_laenge = q.m_laenge; // Kopieren des Dateinamens bezeichnung = new char[strlen(q.bezeichnung) +1]; strcpy ( bezeichnung, q.bezeichnung ); Folie 31/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Überladen von Operatoren class MeinString { char *inhalt; int laenge; void operator= ( const MeinString &zweiterstring ); int operator< ( const MeinString &zweiterstring ) const;... void MeinString::operator= ( const MeinString &zweiterstring ) { laenge = zweiterstring.laenge; delete [] inhalt; inhalt = new char [ laenge+1 ]; strcpy ( inhalt, zweiterstring.inhalt ); Folie 32/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Templates: Funktionstemplates template <class T> T max (T a1, T a2) { if (a1 < a2) return a2; else return a1; kann auf beliebigen Datentypen/Klassen arbeiten nur eine Implementierung notwendig mehrere Platzhalter sind möglich (getrennt durch Kommata) konkrete Variante für bestimmten Datentyp wird erst erstellt, wenn die Funktion damit verwendet wird Trennung von Definition und Deklaration von daher nicht möglich Folie 33/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Templates: Funktionstemplates template <class T> T max (T a1, T a2) { if (a1 < a2) return a2; else return a1; kann auf beliebigen Datentypen/Klassen arbeiten nur eine Implementierung notwendig int main () { std::cout << max(3, 5); std::cout << max<int>(3, 5); mehrere Platzhalter sind möglich (getrennt durch Kommata) konkrete Variante für bestimmten Datentyp wird erst erstellt, wenn die Funktion damit verwendet wird Trennung von Definition und Deklaration von daher nicht möglich Folie 33/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016

Templates: Klassentemplates #ifndef CPPKURSTEM_H #define CPPKURSTEM_H namespace cppkurs { template <class T> class tupleclass { T array[2]; void setvals(t a, T b); T show(); template <class T> void tupleclass<t>::setvals(t a, T b) { array[0] = a; array[1] = b; template <class T> T tupleclass<t>::show() { std::cout << array[0] << ", " << array[1] << std::endl; return array[0] + array[1]; #endif

Hausaufgabe heute Abend auf http://www.ldv.ei.tum.de/lehre/grundkurs-c Abgabetermin: 27. April 2016, 15:00 Uhr per E-Mail an: cpp-ha@ldv.ei.tum.de Folie 35/35 GK C++: IDE, Klassenhierarchien Martin Knopp & Johannes Feldmaier 20.04.2016