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

Ähnliche Dokumente
Programmierpraktikum 3D Computer Grafik

Programmierpraktikum 3D Computer Grafik

Augmented Reality Einführung in C/C++

C++ - Objektorientierte Programmierung Vererbung

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

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

HSR Rapperswil 2001 Markus Rigling. Programmieren: Vererbung. 1 Variante 2

Exceptions und Vererbung

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

Grundlagen Polymorphismus Eigenschaften virtueller Klassen Mehrfachvererbung bei ROOT. Mehrfache Vererbung. Daniel Beneckenstein. 21.

11.3 Virtuelle Methoden

Objektorientierte Programmierung Studiengang Medieninformatik

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

C++ - Objektorientierte Programmierung Konstante und statische Elemente

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

Einstieg in die Informatik mit Java

Einführung in die Programmierung mit C++

11.3 Virtuelle Methoden

Vorausgesetzte Grundkenntnisse. Inhalt. Klassenhierarchie und Vererbung. Vererbung. Klassenhierarchie und Vererbung. Einführung in C# Teil 3

Übersicht. Bisherige Verwendung von Klassen Vererbung. Zeiger auf Objekte (abgeleiteter) Klassen Virtuelle Funktionen Konstruktoren/Destruktoren

Grundkurs C++ IDE Klassenhierarchien

Vererbung und Polymorphie

Grundkurs C++ IDE Klassenhierarchien

Programmierung Nachklausurtutorium

Grundkurs C++ IDE Klassenhierarchien

7 Vererbung. Modul Programmieren mit C++ Kapitel Vererbung

Vererbung und Polymorphie

Vorlesung Datenstrukturen

7. Übung Informatik II - Objektorientierte Programmierung

C++ - Objektorientierte Programmierung Polymorphie

Beispiel: Zwischen der Oberklasse und der abgeleiteten Klasse besteht eine ist ein Beziehung. Eine abgeleitete Klasse stellt eine Spezialisierung der

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 23.5.

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

Vererbung, Polymorphie

Einstieg in die Informatik mit Java

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Die verschiedenen Programmierparadigmen von C++ Software-Technik: Vom Programmierer zur erfolgreichen

Einführung in die Programmiersprache Java II

Programmieren in Java

11 Vererbung und Klassenhierarchie

Implementieren von Klassen

Programmierkurs Java

Programmieren in C++ Vererbung

Programmieren in Java

Grundlagen der Informatik

Algorithmen und Datenstrukturen 07

Einführung in die Programmierung I. 11. Vererbung. Stefan Zimmer

3 VERERBUNG ALLGEMEINES

C++ Teil 12. Sven Groß. 18. Jan Sven Groß (IGPM, RWTH Aachen) C++ Teil Jan / 11

Praxis der Programmierung

Einführung in die Programmierung mit C++

10.4 Konstante Objekte

Java Vererbung. Inhalt

C++ Klassen, Vererbung. Philipp Lucas. Sebastian Hack. Wintersemester 2008/09. saarland.

Klassen. Kapitel Klassendeklaration

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

Objektorientierte Programmierung. Kapitel 14: Interfaces

Programmierung und Angewandte Mathematik

Einstieg in die Informatik mit Java

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Vererbung, Polymorphismus

1 Abstrakte Klassen, finale Klassen und Interfaces

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

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

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

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Java für Bauingenieure

Objektorientierte Programmierung mit C++ SS 2007

Das Interface-Konzept am Beispiel der Sprache Java

Klassen und Konstruktoren in Java

Programmierung und Angewandte Mathematik

Programmierkurs C/C++

Programmierkurs C++ Abstrakte Klassen und Methoden

Vererbung. Florian Adamsky, B. Sc. (PhD cand.) Softwareentwicklung im WS 2014/15.

Vererbung. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java 14.1.

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Vorlesung Programmieren. Bisher: Klassen und Objekte. Was ist mit ähnlichen Klassen? Vererbung und Polymorphismus

Fragen zur OOP in Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

Kapitel 8 Vererbung. Korbinian Molitorisz. IPD Tichy Lehrstuhl für Programmiersysteme

OMSI / Teil 1 / C++ Andreas Blunk. 5. April 2006, Berlin

Vererbung P rogram m ieren 2 F örster/r iedham m er K apitel 11: V ererbung 1

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

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

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

Objektorientierte Programmierung III

Java Einführung Vererbung und Polymorphie. Kapitel 13

Algorithmen und Datenstrukturen

7. Schnittstellen Grundlagen zu Schnittstellen. 7. Schnittstellen

Prof. W. Henrich Seite 1

Weitere Beispiele. Beispiel CD-Spieler: Exemplare eines abstrakten Konzepts. 7. Schnittstellen. Schnittstelle: Syntax

4. Vererbung Die Klasse Object. Die Klasse Object

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Programmiertechnik Klassenvariablen & Instantiierung

Präsentation Interfaces

C++ Klassen weitere Funktionen

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Info B VL 8: Abstrakte Klassen & Interfaces

Transkript:

3D Programmierpraktikum: Einführung in C++ - Teil 2 Praktikum 3D Programmierung Sebastian Boring, Otmar Hilliges Donnerstag, 4. Mai 2006 LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 1 Agenda Funktionen Header-Dateien Mehrfachvererbung Ausnahmen LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 2 Programmierung - SS 2006 1

Funktionen [Rückgabetyp] [Name] ([Parameter]) { Wichtig: Funktionen müssen vor dem Aufruf deklariert werden, d.h. sie müssen in den Zeilen über dem Aufruf stehen Funktionsprototypen umgehen diese Bedingung und stellen eine Signatur dar Beispiel für eine Signatur: int factorial(int); LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 3 Header-Dateien Dienen zur zentralen Verwaltung von Definitionen, die in verschiedenen Modulen benötigt werden Enthalten typischerweise globale Konstanten, Variablen, Funktionen und definitionen Bedingte Übersetzung: #ifndef HEADER_H #define HEADER_H #endif LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 4 Programmierung - SS 2006 2

Enthalten Attribute und Funktionen Werden typischerweise in Header-Dateien deklariert Beispiel einer Deklaration: class Person { private: char* name; int age; public: void setname(char*); void setage(int); LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 5 Deklaration von Funktionen mit inline: Implementierung direkt in der Deklaration Zwei verschiedene Arten: Direkt in der Deklaration (ohne inline) Im Header-File nach der Deklaration (mit inline) Beispiel (direkt in der Deklaration): // statt void setage(int); void setage(int age) { this->age = age; LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 6 Programmierung - SS 2006 3

Deklaration von Funktionen mit inline: Beispiel(mitinline): class Person { void setage(int); inline void Person::setAge(int a) { age = a; LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 7 Erzeugen von Objekten: Statische Erzeugung: Person peter; Person john; Objekte werden gelöscht, wenn der Gültigkeitsbereich des Objekts verlassen wird Dynamische Erzeugung: Person* peter; peter = new Person; delete peter; // ruft Destruktor auf LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 8 Programmierung - SS 2006 4

Konstruktoren: Definiert als Methode einer Klasse Name ist identisch zum Namen der Klasse Kein Rückgabewert (auch nicht void) Mehrere Konstruktoren durch Überladen Deklaration im public Abschnitt Minimaler Default-Konstruktor wird erzeugt, falls kein Konstruktor vorhanden ist LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 9 Konstruktoren: Aufruf bei der Erzeugung durch new oder bei der Erzeugung eines statischen Objekts Minimaler Konstruktor: Person::Person() { Standard-Konstruktor: Person::Person() { name = NULL; age = 0; LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 10 Programmierung - SS 2006 5

Konstruktoren: Andere Konstruktoren: Person::Person(char* n, int i = 0) { name = n; age = i; Person::Person(char* n, int i = 0) : name(n), age(i) { Beschreibt zwei Konstruktoren: Person::Person(char* n) { Person::Person(char* n, int i) { LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 11 Beispiele für statisches Erzeugen: Person::Person; // Default Person::Person( Peter ); // age = 0 Person::Person( Peter, 45); Beispiele für dynamisches Erzeugen: peter* = new Person::Person; peter* = new Person::Person( Peter ); LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 12 Programmierung - SS 2006 6

Löschen von Objekten: Mittels Destruktor (beginnt mit ~) Wird aufgerufen, sobald der Gültigkeitsbereich eines statischen Objekts verlassen wird, oder delete aufgerufen wird Minimaler Destruktor: Person::~Person() { Besitzt keinen Rückgabetyp (wie Konstruktor) Nur ein Destruktor möglich Sinn: Löschen von Unterobjekten LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 13 Zugriffsoperator: Mit dem Punkt-Operator. Bei Zeigern auf ein Objekt mit Pfeil -> Beispiel: Person peter; Person* john = new Person; peter.setname( Peter ); john->setage(35); delete john; LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 14 Programmierung - SS 2006 7

Syntax: class subclass : [modifier] superclass1, [modifier] superclass2, [modifier] superclassn { Keine für Konstruktoren, Destruktor und Zuweisungs-Operator LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 15 Generell gilt: Alles was nicht überschrieben wird, wird geerbt Zugriff auf eine überschriebene Methode der Superklasse (super.[method] in Java): Scope-Operator :: Beispiel: Employee erbt von Person Employee a; a.print(); a.person::print(); LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 16 Programmierung - SS 2006 8

Beispiel: class Employee : public Person { void print() { // print(); // endlos Person::print(); cout << blah << endl; Employee a; a.print(); a.person::print(); LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 17 Konstruktoren: Elemente der Basisklasse werden durch Konstruktor der Basisklasse initialisiert Initialisierungsliste: class_name::class_name(parameter_list) : superclass1(parameters), superclass2(parameters), Konstruktoren der Basisklasse werden vor dem Konstruktor der abgeleiteten Klasse ausgeführt! LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 18 Programmierung - SS 2006 9

Destruktoren: Löschen von Elementen der Basisklasse muss in der Basisklasse erfolgen Destruktor der Basisklasse wird automatisch aufgerufen nach dem Destruktor der abgeleiteten Klasse LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 19 Zeiger auf Objekte: Zeiger auf ein Objekt einer abgeleiteten Klasse kann einem Zeiger auf eine Basisklasse zugewiesen werden: Unterklasse ist eine Erweiterung Umkehrung funktioniert nicht: Typecasting notwendig Allgemeine Regel: Speziellere Typen (abgel. Klasse) können einem allgemeinerem Typ (Basisklasse) zugewiesen werden LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 20 Programmierung - SS 2006 10

Typecasting: reinterpret_cast<type>(parameter); Keine Überprüfungen, keine Wertänderung Zeigertyp in beliebigen anderen Zeigertyp ändern static_cast<type>(parameter); Implizit mögliche Casts und Umkehrung möglich Basisklasse <-> abgel. Klasse, int <-> char Keine echte Überprüfung auf Typkompatibilität dynamic_cast<type>(parameter); Laufzeittyp wird bei der Überprüfung verwendet Wie das Casting in Java LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 21 Virtuelle Methoden: Zugriff auf Elemente einer abgeleiteten Klasse nur nach einem Casting des Zeigers Ziel: Ausführung einer geeigneten Methode der Unterklasse (ohne diese explizit zu kennen (bei Java immer so) Lösung: Virtuelle Methoden Semantik wird vom Objekt und nicht vom Zeiger definiert Realisierung mit dem Schlüsselwort virtual in der Basisklasse Speicherverbrauch steigt (Objekt enthält Zeiger auf die vtable der Klasse) LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 22 Programmierung - SS 2006 11

Beispiel in Java: class Person { public void print(); class Employee extends Person { public void print(); Person p = new Person(); Person pe = new Employee(); p.print(); // Person.print(); pe.print(); // Employee.print(); LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 23 Beispiel in C++ (ohne virtuelle Methoden): class Person { public: void print(); class Employee : public Person { public: void print(); Person* p = new Person; Person* pe = new Employee; p.print(); // Person::print(); pe.print(); // Person::print(); LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 24 Programmierung - SS 2006 12

Beispiel in C++ (mit virtuellen Methoden): class Person { public: virtual void print(); class Employee : public Person { public: void print(); Person* p = new Person; Person* pe = new Employee; p->print(); // Person::print(); pe->print(); // Employee::print(); LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 25 Virtuelle Destruktoren: Dynamisch erzeugte Objekte können einem Zeiger der Oberklasse zugewiesen werden Wird das Objekt gelöscht, wird nur der Destruktor der Oberklasse aufgerufen Lösung: virtueller Destruktor Das Schlüsselwort virtual wird in der Basisklasse vor dem Konstruktor angegeben class class_name { virtual ~class_name() { LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 26 Programmierung - SS 2006 13

Abstrakte : Nicht alle deklarierten Methoden werden implementiert Instanzen dieser Klasse gibt es nicht Unterklassen können Instanzen haben, sofern alle deklarierten Methoden implementiert sind Syntax: class class_name { virtual return_type method_name(parameter_list)=0; LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 27 Mehrfachvererbung Unterklasse hat mehrfache Basisklassen Unterklasse enthält jede Basisklasse Konstruktor der abgel. Klasse kann Konstruktoren von allen Basisklassen aufrufen Wird ein Objekt einer abgel. Klasse vernichtet, werden die Destruktoren aller Basisklassen gerufen LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 28 Programmierung - SS 2006 14

Mehrfachvererbung Beispiel: class Base1 { public: Base1(int, char*); class Base2 { public: Base2(int, float); class Derived : public Base1, public Base2 { public: Derived(char* s, int i) : Base1(i, s), Base2(i, 4.2f) { LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 29 Mehrfachvererbung Problem: Mehrdeutigkeiten bei Namenskollisionen Zwei oder mehr Basisklassen haben gleiches Element: Member-Variablen Methoden (gleicher Name und Parameter) Nutzlos: private Scope-Operator :: als Lösung: Methode überschreiben und gewünschte Methode der Basisklasse mit :: auswählen LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 30 Programmierung - SS 2006 15

Mehrfachvererbung Beispiel: Amphibienfahrzeug ist sowohl Auto als auch Boot Deklarieren beide Basisklassen eine Methode move(int d) gibt folgender Aufruf einen Fehler: Amphibienfahrzeug a; a.move(10); Es ist ein mehrdeutiger Aufruf, da nicht klar ist, ob move der Klasse Boot oder der Klasse Auto aufgerufen werden soll LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 31 Mehrfachvererbung Fahrzeug Auto Boot Amphibienfahrzeug Klasse Fahrzeug wird mehrfach eingebunden und damit auch ihre Attribute und Methoden LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 32 Programmierung - SS 2006 16

Mehrfachvererbung Lösung: Erben mit dem Schlüsselwort virtual führt dazu, dass die Komponenten nur einmal eingebunden werden Zugriff ohne Bereichsoperator eindeutig und deshalb möglich LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 33 Ausnahmen Drei Schlüsselwörter: Versuchsblock: try Ausnahme erzeugen: throw Abfangen: catch Es existiert kein finally Exceptions sind nicht Teil der Methodensignatur, d.h. sie können überall geworfen werden Fangen aller Exceptions: catch( ) LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 34 Programmierung - SS 2006 17

Ausnahmen Funktionen können eine Exception-Liste angeben Das Schlüsselwort throw im Funktionsprototyp: return_type method_name(parameters) throw (exception_list) { Funktionen können dennoch weitere Exceptions erzeugen (auch wenn diese nicht in der Liste enthalten sind) LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 35 Ausnahmen Abfangen von Ausnahmen: try { if(error) throw exception_class( ); catch(exception_class variable) { // exception handling LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 36 Programmierung - SS 2006 18

Ausblick Nächste Woche: GLUT Erzeugen eines Fensters Erkennen und Verarbeiten von Tastatur- und Mauseingaben Start mit einfachen Objekten in OpenGL Grundlagen der 3D-Computergrafik LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 37 Literatur Nicolai Josuttis, Objektorientiertes Programmieren in C++, ISBN 3-8273-1771-1 LMU München Medieninformatik Boring/Hilliges 3D Programmierpraktikum SS2006 04.05.2006 Folie 38 Programmierung - SS 2006 19