Programmieren 2 C++ Überblick

Ähnliche Dokumente
5. Behälter und Iteratoren. Programmieren in C++ Überblick. 5.1 Einleitung. Programmieren in C++ Überblick: 5. Behälter und Iteratoren

Objektorientierte Programmierung OOP

Beziehungen zwischen Objekten

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

Objektorientierte Programmierung mit C++ SS 2007

3. Konzepte der objektorientierten Programmierung

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Prinzipien der objektorientierten Programmierung (OOP)

Vererbung und Polymorphie

Polymorphismus 179. Function.h. #include <string>

Lösungen zu Übung 3 Objektorientierte Modellierung - Statisches Modell

Programmieren in Java

11 Vererbung und Klassenhierarchie

Vererbung und Polymorphie

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

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

Objektorientiertes Programmieren

Javakurs für Anfänger

Programmieren 2 Java Überblick

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

01. Grundprinzipien der Vererbung

Theorie zu Übung 8 Implementierung in Java

Java für Bauingenieure

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

Lösungen zu Übung 3 Objektorientierte Modellierung - Statisches Modell

UML -Klassendiagramme

Einstieg in die Informatik mit Java

Vorlesung Datenstrukturen

Rückblick: Benutzerdefinierte Datentypen Definition der Klasse Vektor als Container für 2-dimensionale Vektoren

Objektorientierte Programmierung Studiengang Medieninformatik

7. Programmierungs- Phase Software Engineering (FB EIT) Wintersemester 2007 / 2008 Prof. Dr. Bernhard Humm Hochschule Darmstadt, FB Informatik

Javakurs für Anfänger

8. Objektorientierte Programmierung. Informatik II für Verkehrsingenieure

Überblick. Überblick. Abstrakte Klassen - rein virtuelle Funktionen Beispiele

Einführung in die Programmiersprache Java II

Programmierkurs C++ Abstrakte Klassen und Methoden

10. Programmierungs-Phase: Objektorientierung Software Engineering

Liste MI / Liste I Programmieren in C++

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

Von der UML nach C++

Objektorientierte und Funktionale Programmierung SS 2014

4. Objektorientierte Programmierung mit C++

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

Blöcke. Block Definitionsdiagramm. Dr. Beatrice Amrhein

Assoziation und Aggregation

Begriffe 1 (Wiederholung)

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

Objektorientierung. Objekte

Modellierung und Programmierung 1

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Anwendungsentwicklung mit Java. Grundlagen der OOP, Vererbung, Schnittstellen, Polymorphie

Einstieg in die Informatik mit Java

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

Silke Trißl Wissensmanagement in der Bioinformatik. Objektorientierte Programmierung (OOP) Vorstellung wie in der realen Welt: Farbe Hubraum Tank...

Java Vererbung. Inhalt

Sommersemester Implementierung I: Struktur

Informatik II Übung, Woche 17

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

Objektorientierte Programmierung. Kapitel 14: Interfaces

Objektorientierte Programmierung Studiengang Medieninformatik

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

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

Objektorientierte Programmierung und Klassen

Exceptions und Vererbung

Methoden und Klassen. Silke Trißl Wissensmanagement in der Bioinformatik

Objektorientierte Programmierung Studiengang Medieninformatik

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

Einführung in die Programmierung mit C++

Programmieren II. Abstrakte Klassen, Interfaces Heusch 13.8, 13.9 Ratz Institut für Angewandte Informatik

Vererbung. Oberklassen und Unterklassen

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

C++ - Objektorientierte Programmierung Vererbung

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

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

Programmieren in Java

Informationsverarbeitung im Bauwesen

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

Wahlpflichtfach Design Pattern

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

Einstieg in die Informatik mit Java

Grundkurs C++ IDE Klassenhierarchien

Grundlagen der Objektorientierung :

Th. Letschert OOP 2 2. Geheimnisprinzip und Sichtbarkeitsbeziehungen

Objektorientierte Programmierung Teil 1: Einführung

Universität Stuttgart Institut für Automatisierungstechnik und Softwaresysteme Prof. Dr.-Ing. M. Weyrich

A&R TECH C++ Chess Challenge

Java Einführung Vererbung und Polymorphie. Kapitel 13

Repetitorium Informatik (Java)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Objektorientierte Programmierung mit Java. Grundlagen Übersicht. Programmiersprachen

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Transkript:

Programmieren 2 C++ Überblick 1. Einführung und Überblick 2. Klassen und Objekte: Datenkapselung 3. Erzeugung und Vernichtung von Objekten 4. Ad-hoc Polymorphismus 5. Behälter und Iteratoren 6. Templates und generische Programmierung 7. Standard Template Library 8. Vererbung 10. Fehlerbehandlung 11. Namensräume und Typinformation zur Laufzeit 12. Dateien und Ströme 13. Zusammenfassung objektorientierter Merkmale Prof. Dr. Björn Dreher Programmieren 2 C++ 555 Programmieren 2 C++ Überblick: 9.1 Einleitung Prof. Dr. Björn Dreher Programmieren 2 C++ 556

9.1 Einleitung Objektorientierte Anwendung: Menge von Objekten, die zueinander in Beziehung stehen Diese Beziehungen können unterschiedlichster Natur sein: Vererbung, d.h. Spezialisierung (is-a Beziehung) Aggregation (Teil-Ganzes Beziehung) Assoziation Delegation ( Benutzt -Beziehung) Betrachten wir die einzelnen Fälle und ihre Realisierung in C++ Prof. Dr. Björn Dreher Programmieren 2 C++ 557 Programmieren 2 C++ Überblick: 9.1 Einleitung Prof. Dr. Björn Dreher Programmieren 2 C++ 558

Vererbung wurde bereits ausführlich besprochen Hier: Besondere Grenzfälle Wichtig bei public Vererbung: Die Beziehung zwischen den Klassen muss auch semantisch wirklich eine is-a Beziehung sein Eine abgeleitete Klasse kann als Subtyp der Oberklasse angesehen werden. Ein Objekt einer abgeleiteten Klasse kann immer an die Stelle eines Objektes der Oberklasse treten (alle Methoden und Attribute der Oberklasse sind vorhanden) Prof. Dr. Björn Dreher Programmieren 2 C++ 559 Nachdenkenswerte Fälle Ein Quadrat ist mathematisch ein Rechteck (wobei beide Seitenlängen gleich sind), also ein Spezialfall eines Rechtecks wie ein Kreis ein Spezialfall einer Ellipse ist Graphische Repräsentation dieses Beispiels: hoehe: int breite: int Rechteck hoeheaendern() breiteaendern() Quadrat hoeheaendern() breiteaendern() Prof. Dr. Björn Dreher Programmieren 2 C++ 560

Die Spezialisierung von Rechteck zu Quadrat drückt sich in der folgenden öffentlichen Vererbung aus: class Quadrat : public Rechteck ; Eine Klasse Rechteck wird wohl Methoden haben, die es erlauben, die Seiten unabhängig voneinander zu verändern: class Rechteck virtual void hoeheaendern(int neu) hoehe = neu; virtual void breiteaendern(int neu) breite = neu; private: int hoehe; int breite; ; Diese Methoden haben in der Klasse Quadrat nichts zu suchen Prof. Dr. Björn Dreher Programmieren 2 C++ 561 Rechteck -> Quadrat Lösung aus Literatur: Vererbung bei einer Spezialisierung auch als Einschränkung (constraint) der Oberklasse benutzen (Booch: inheritance for restriction ) Wichtige Eigenschaft der objektorientierten Vorgehensweise: Begriffe aus dem Anwendungssprachraum werden über Analyse und Design weitgehend bis in die Implementierung übertragen Mathematisch ist ein Quadrat ein Rechteck Aber ist es sinnvoll bei der Implementierung dann auch für das Quadrat zwei Seitenlängen mitzuschleppen? Zusätzlich muss man dafür Sorge tragen, dass diese immer den gleichen Wert besitzen Prof. Dr. Björn Dreher Programmieren 2 C++ 562

Rechteck -> Quadrat Vertrag zwischen Klasse und Benutzer ( programming by contract ) Klasse muss diesen einhalten, also dafür sorgen, dass ein Quadrat auch immer ein Quadrat bleibt Dies lässt sich natürlich relativ leicht bewerkstelligen: class Quadrat : public Rechteck virtual void hoeheaendern(int neu) Rechteck::hoeheAendern(neu); Rechteck::breiteAendern(neu); virtual void breiteaendern(int neu) hoeheaendern(neu); ; Damit wird der mit Quadrat geschlossene Vertrag eingehalten, auch für alle möglichen Nachfahren. Prof. Dr. Björn Dreher Programmieren 2 C++ 563 Rechteck -> Quadrat Alternative: Rechteckklasse wird benutzt, die Quadrat-Klasse delegiert an die Rechteck-Klasse: class Quadrat // Keine Vererbung Quadrat(const Ort& o, int seite) : r(o, seite, seite) // privates Rechteck // initialisieren virtual void seiteaendern(int neu) r.hoeheaendern(neu); r.breiteaendern(neu); // Weitere Methoden, die Methoden der Klasse // Rechteck benutzen private: Rechteck r; ; Prof. Dr. Björn Dreher Programmieren 2 C++ 564

Rechteck -> Quadrat Graphische Darstellung: r: Rechteck Quadrat Quadrat() seiteaendern() Komposition hoehe: int breite: int Rechteck hoeheaendern() breiteaendern() Prof. Dr. Björn Dreher Programmieren 2 C++ 565 Rechteck -> Quadrat: Ergebnis: Der Benutzer von Quadrat sieht die Methoden der Klasse Rechteck nicht mehr Das eingebettete Rechteck ist voll gekapselt Dennoch wird der von der Klasse Rechteck zur Verfügung gestellte Code wieder verwendet, indem Aufgaben an die Klasse Rechteck delegiert werden Nachteil: Quadrat und Rechteck können nicht polymorph verwendet werden Ließe man Quadrat und Rechteck von einer gemeinsamen abstrakte Klasse GraphObject erben, hätte man das Problem, dass der dort definierte Mittelpunkt sowohl an Quadrat als auch an das benutzte Rechteck vererbt würde -> auch nicht schön! Prof. Dr. Björn Dreher Programmieren 2 C++ 566

Rechteck -> Quadrat Doch die bessere Idee (?) Beide Klassen unabhängig voneinander von GraphObject ableiten und in Kauf nehmen, dass ein Teil des Codes doppelt geschrieben werden muss, insbesondere wenn Quadrat nur wenig Code von Rechteck verwendet Prof. Dr. Björn Dreher Programmieren 2 C++ 567 Ähnliches Problem: Stack und Liste Ist Stack eine Spezialisierung einer Liste? Hier ist Delegation sicher die bessere Lösung, da beide Listen höchst wahrscheinlich nicht als polymorphe Objekte behandelt werden müssen Ein Objekt einer abgeleiteten Klasse muss jederzeit an die Stelle eines Basisklassenobjektes treten können, um public Vererbung zu rechtfertigen Nur dann kann die abgeleitet Klasse als Subtyp der Basisklasse angesehen werden Quadrat und Rechteck: Rechteck habe eine Methode SeitenverhaeltnisAendern(). Auswirkung auf Quadrat? Prof. Dr. Björn Dreher Programmieren 2 C++ 568

Programmieren 2 C++ Überblick: 9.1 Einleitung Prof. Dr. Björn Dreher Programmieren 2 C++ 569 Teil-Ganzes Beziehung (engl. part-of) Ein Objekt besteht aus mehreren anderen Objekten Die Teile sind in dem ganzen Objekt enthalten Dies kann in Form eingebetteter Objektinstanzen (strengere Form der Aggregation: Composition) oder in Form von Zeigern auf die Teilobjekte (Teilobjekte könne evtl. auch unabhängig vom Ganzen existieren) implementiert werden. Prof. Dr. Björn Dreher Programmieren 2 C++ 570

Eingebettet: Komposition Das Ganze sei eine Tastatur. Sie besteht aus einem Gehäuse, einem Kabel, einer Platine und 102 Tasten: class Tastatur private: Gehaeuse eingehaeuse; Kabel einkabel; Platine eineplatine; Taste tastenfeld[102]; ; Tastatur 102 Kabel Gehäuse Platine Taste Prof. Dr. Björn Dreher Programmieren 2 C++ 571 Programmieren 2 C++ Überblick: 9.1 Einleitung Prof. Dr. Björn Dreher Programmieren 2 C++ 572

Allgemeinste Art der Beziehung zwischen zwei Objekten Aggregation kann als ein Spezialfall der Assoziation angesehen werden. Bestehende Assoziation heißt, dass die beteiligten Objekte sich kennen, d.h. sie haben i.a. als eines ihrer Attribute einen Zeiger oder eine Referenz auf das andere Objekt Dies kann in beide Richtungen gehen oder auch nur in eine, je nach Notwendigkeit des Navigierens von einem Objekt zum anderen Prof. Dr. Björn Dreher Programmieren 2 C++ 573 Beispiel Person Firma bekanntenkreis * name: String arbeitgeber: Firma* bekanntenkreis list<person*> Person() lerntkennen(person&) wieheisstdu(): String findetarbeitbei(firma&) kuendigt() ist beschäftigt bei * mitarbeiter: list<person*> Firma() einstellen(person*) Prof. Dr. Björn Dreher Programmieren 2 C++ 574

class Person; // Vorwärtsdeklaration class Firma einstellen(person* p); private: list<person*> mitarbeiter; ; bekanntenkreis * Person name: String arbeitgeber: Firma* bekanntenkreis list<person*> Person() lerntkennen(person&) wieheisstdu(): String findetarbeitbei(firma&) kuendigt() ist beschäftigt bei * Firma mitarbeiter: list<person*> Firma() einstellen(person*) Prof. Dr. Björn Dreher Programmieren 2 C++ 575 class Person void lerntkennen(person& p) bekanntenkreis.hinzufuegen(&p); String wieheisstdu() return name; void findetarbeitbei(firma& f) arbeitgeber = &f; f.einstellen(this); void kuendigt() arbeitgeber->entlassen(this); arbeitgeber = NULL; private: String name; Firma *arbeitgeber; list<person*> bekanntenkreis; bekanntenkreis * Person name: String arbeitgeber: Firma* bekanntenkreis list<person*> Person() lerntkennen(person&) wieheisstdu(): String findetarbeitbei(firma&) kuendigt() ist beschäftigt bei * Firma mitarbeiter: list<person*> Firma() einstellen(person*) Prof. Dr. Björn Dreher Programmieren 2 C++ 576

Ein mögliches Hauptprogramm: Firma is_bremen_gmbh; Person walter, thomas, sonja; thomas.findetarbeitbei(is_bremen_gmbh); walther.findetarbeitbei(is_bremen_gmbh); thomas.lerntkennen(sonja); thomas.lerntkennen(walter); thomas.kuendigt(); Prof. Dr. Björn Dreher Programmieren 2 C++ 577 Programmieren 2 C++ Überblick: 9.1 Einleitung Prof. Dr. Björn Dreher Programmieren 2 C++ 578

Benutzt -Beziehung Ein Objekt A macht sich die Dienste eines anderen Objektes B nutzbar Es delegiert Aufgaben an dieses andere Objekt Dazu besitzt A i.a. einen Zeiger auf B als Attribut Damit kennt es Objekt B und kann dessen öffentliche Methoden benutzen Prof. Dr. Björn Dreher Programmieren 2 C++ 579 Beispiel Ein Heizregler benutzt einen Temperaturfühler zum Messen der Temperatur: class Heizregler // Konstruktoren bool warmgenug() return (dasthermometer->wiewarm() > 20); private: Temperaturfuehler* dasthermometer; ; Auch diese Beziehung ist eine Assoziation Prof. Dr. Björn Dreher Programmieren 2 C++ 580