10. Grundlagen der Objektorientierung

Ähnliche Dokumente
01. Grundprinzipien der Vererbung

7. Übung Informatik II - Objektorientierte Programmierung

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

Programmieren II Abstrakte Klassen / Virtuelle Methoden. Programmieren II Abstrakte Klassen / Virtuelle Methoden

3. Objektorientierung Ergänzungen

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

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Repetitorium Informatik (Java)

Vererbung I. Kfz Eigenschaften und Methoden der Klasse Kfz Lkw. Pkw. Eigenschaften und Methoden der Klasse Kfz

Klausur Informatik I WS 2006/2007

C++ - Objektorientierte Programmierung Vererbung

Objektorientierte Programmierung Studiengang Medieninformatik

Objektorientierung: Klassen und Objekte

Objektorientierte Programmierung mit C++ SS 2007

Algorithmen und Datenstrukturen

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

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

Klassen. Kapitel Klassendeklaration

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

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

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

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

Algorithmen zur Datenanalyse in C++

Informationsverarbeitung im Bauwesen

Klausur Programmieren 2 SS 2016

1 Klassen und Objekte

C++ Teil 9. Sven Groß. 17. Juni Sven Groß (IGPM, RWTH Aachen) C++ Teil Juni / 17

Kap 9. Bitoperationen und -strukturen

Vererbung und Polymorphie

Programmieren in C/C++ und MATLAB

Einstieg in die Informatik mit Java

Nachname: Vorname: Matr.-Nr.: Punkte: 1. Aufgabe: ( / 25 Pkt.) Gegeben ist das folgende Struktogramm zur Berechnung von sin(x) mit Hilfe einer Reihe.

Grundlagen der Informatik

Umsetzung einer Klassenkarte in einer Programmiersprache

Einstieg in die Informatik mit Java

8. Referenzen und Zeiger

Einstieg in die Informatik mit Java

Verwendung von Klassen in C++

Vorkurs C++ Programmierung

Einstieg in die Informatik mit Java

Grundlagen der Informatik 12. Strukturen

Aufbau von Klassen. class punkt {...

FB Informatik. Fehler. Testplan

Crashkurs C++ Wiederholung

Mikrorechentechnik II. Klassen in C++

Projekt 3 Variablen und Operatoren

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

Klassenmethoden. Klassenvariablen. Für das Auslesen des Studentenzählers definieren wir eine öffentliche Klassenmethode:

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

Einstieg in die Informatik mit Java

Programmierkurs C/C++

Einführung in die Programmierung

Grundkurs C++ IDE Klassenhierarchien

Prof. W. Henrich Seite 1

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

Grundkurs C++ IDE Klassenhierarchien

Vererbung, Polymorphie

Programmieren in Java

OOP und Angewandte Mathematik (Praktikum 1) Eine Einführung in die Anwendung objektorientierter Konzepte in der angewandten Mathematik

C++ - Einführung in die Programmiersprache Header-Dateien und Funktionen. Leibniz Universität IT Services Anja Aue

Überblick. Überblick zum weiteren Inhalt

Objektorientierte Programmierung und Klassen

Begriffe 1 (Wiederholung)

Themen. Formatierte und unformatierte Eingabe Bedingungsoperator Namespaces Kommandozeilenargumente

Klausur Informatik WS 2012/13

Objektorientierung Grundlagen

Klassen als Datenstrukturen

Informatik 1 MaVt FS Übung 10

Algorithmen und Datenstrukturen 06

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Prof. Dr. Oliver Haase Karl Martin Kern Achim Bitzer. Programmiertechnik Objektorientierung

Lösung der OOP-Prüfung WS12/13

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

Vererbung und Polymorphie

Klausur Programmieren 2 WS2016/17

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Java Einführung Methoden in Klassen

5. Elementare Befehle und Struktogramme

Einführung in die Programmierung für NF MI. Übung 07

Einführung in die Programmiersprache Java II

Einführung in die Programmierung mit C++

Vererbung und Polymorphie

Einstieg in die Informatik mit Java

Programmiertechnik Objektorientierung

Probeklausur: Programmierung WS04/05

Objektorientiertes Programmieren mit C++ für Fortgeschrittene

Hydroinformatik I: Klassen

15. Die Klasse string

Auswahlen (Selektionen)

Überblick. 5. Objekt und Klasse, Elementfunktionen

Hydroinformatik I: Klassen

Einstieg in die Informatik mit Java

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

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

Objektorientierte Programmierung Studiengang Medieninformatik

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

Vorkurs Informatik: Erste Schritte der Programmierung mit C++

Klausur Programmieren 1 SS 2017

5. Strukturen und Algorithmen

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

Transkript:

10. Grundlagen der Objektorientierung

10.1 Der objektorientierte Ansatz Bisheriger Funktionsorientierter Ansatz Trennung von Deklaration/Definition von passiven Daten und aktiven Befehlen/Funktionen Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 2

Funktionsorientierter Ansatz Funktion 0 Daten Funktion 1 Funktion 2 Funktion 2.1 Funktion 2.2 Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 3

Objekt A Objektorientierter Ansatz Öffentlichkeit (Programm) Objekt B Daten von A Daten von B Funktion 1 Funktion y Funktion 2 Funktion 3 Funktion z Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 4

Objektorientierter Ansatz Objekt Daten Die Daten eines Objekts sind privat und werden üblicherweise als Eigenschaften oder Attribute bezeichnet. Funktion 1 Funktion 2 Funktion 3 Die Funktionen eines Objekts sind öffentlich und werden üblicherweise als Methoden bezeichnet. Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 5

Klassen und Objekte Objekte mit gemeinsamen Eigenschaften und Methoden werden in einem Datentyp Klasse zusammengefasst. Die Klasse ist das wesentliches Sprachelement der Objektorientierten Programmierung (OOP). Objekte sind dann Variable vom Typ der Klasse und somit beschrieben durch die Eigenschaften Methoden = Daten mit konkreten Werten = Funktionen zur Bearbeitung der Daten. Klasse : Datentyp Objekt : deklarierte Variable Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 6

Beispiele für Klassen Klasse Eigenschaften Methoden Bauteil Eingang verbinden Ausgang anzeigen Stromfluss... PKW Hersteller fahren Typ bremsen Leistung parken Tankstand anlassen... Konto Eigentümer eröffnen Nummer einzahlen Stand abheben... Datum Tag setzen Monat anzeigen Jahr vergleichen... Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 7

Beispiele für Klassen Klasse Eigenschaften Methoden Bruch Zaehler + - * / Nenner < > = kürzen... Punkt x anzeigen y verschieben Betrag x/y ändern Bezeichnung... Kreis Mittelpunkt definieren Radius Radius setzen Umfang Durchmesser Problem: Konsistenz von Betrag und Koordinaten Problem: Konsistenz von Radius Umfang und Durchmesser Linie Vektor aus Punkten Punkt löschen Punkt einfügen... Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 8

Beispiele für Klassen Klasse Eigenschaften Methoden Rahmenfenster einer Windowsapplikation CFrameWnd menuename Create parentwindow... Anwenderformular Formular1 Eingabefeld1 OnCancel Eingabefeld2 OnOK OnRadio1... Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 9

Beispiele für Objekte Datum Klausurtermin; Bruch a; Bauteil Kabel; Tag = 10 zaehler=19 Monat = 2 nenner = 2 Jahr = 2007. Eingang Ausgang Stromfluss Bezeichnung = leer = leer = false = gelbes Kabel Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 10

Begriffe Eigenschaft Member-Variable, Instanzvariable, Datenelement Attribute Methode Member-Funktion, Elementfunktion, Operation, Dienste Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 11

UML Analog zu den Struktogrammen gibt es zur Beschreibung objektorientierter Modelle eine grafische Darstellung : UML-Diagramme (Unified Modeling Language) Für die verschiedenen Ansichten des Systems gibt es jeweils die dazu passenden Diagramme, gegliedert nach: Strukturelle Sichten: Zur Darstellung statischen Architektur eines Systems (Klassen, Komponenten, Subsysteme, ) Verhaltenssicht : Zur zeitlich/dynamischen Darstellung eines Systems (Interaktionen, Aktivitäten, ) In dieser Vorlesung wird nur eine kleine Auswahl der UML beschrieben Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 12

UML/Diagramme Dargestellt werden u.a.: Strukturdiagramme: Klassendiagramm: Klassen und ihre Beziehungen Objektdiagramm: Ausprägung der Klassen und Beziehungen sowie Komponenten-, Kompositions-, Paket-, Verteilungsdiagramm Verhaltensdiagramme: Aktivitäts-, Anwendungsfall-, Interaktions-, Zustandsdiagramm Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 13

UML/Klassendiagramm Es werden Klassen und ihre Beziehungen zueinander dargestellt. Klassen werden durch Rechtecke mit den Rubriken Name Eigenschaften Methoden beschrieben. Die Rubriken sind durch waagerechte Linien getrennt. allgemein Beispiel Name Eigenschaften Methoden Bauteil -Bezeichnung -Eingang -Ausgang -Stromfluss +Verbinden +Anzeigen... Dabei steht: + für public - für private # für protected Beziehungen unter Klassen -> später Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 14

UML/Objektdiagramm Es werden Objekte und ihre Beziehungen zueinander dargestellt. Objekte werden durch analog zu den Klassen als Rechtecke mit den Rubriken Name Eigenschaften (mit Ausprägung=Wert) beschrieben. allgemein Beispiel Objektname:Klassenname Eigenschaft1=... Eigenschaft2= gelbeskabel: Bauteil Bezeichnung= gelbeskabel Eingang=leer Ausgang=leer Stromfluss=false Beziehungen -> später Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 15

10. 2 Grundprinzipien der Objektorientierung Datenabstraktion Beschreibung durch Eigenschaften und Methoden Datenkapselung Zugriff auf Eigenschaften durch die Methoden Vererbung Bildung neuer Klassen aus existierenden Klassen mit Übernahme=Vererbung der Eigenschaften und Methoden Polymorphie (Vielgestaltigkeit) Anpassung der Methoden zur Laufzeit (!) Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 16

Datenabstraktion Klassen werden gebildet durch die Beschreibung ihrer Eigenschaften und Methoden Eine Klasse ist also charakterisiert durch die Zusammenfassung aller Gemeinsamkeiten von Eigenschaften und Methoden. Eine Klasse ist das Muster (die Schablone) für Objekte. Objekte sind Variable vom Typ der zugehörigen Klasse. Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 17

Datenkapselung Es erfolgt ein kontrollierter Zugriff auf die Eigenschaften (Daten) der Objekte durch Bereitstellung zugehöriger Methoden : -die interne Darstellung/Abspeicherung ist damit irrelevant -Der Zugriff erfolgt üblicherweise durch öffentliche Methoden -Die Eigenschaften sind üblicherweise im nicht-öffentlichen (privaten) Bereich geschützt ->Sicherung der Konsistenz der Daten, da keine unkontrollierte Änderung! Anmerkung Man kann auch Eigenschaften/Daten öffentlich bereitstellen. Dann können diese Daten direkt manipuliert werden. -> normalerweise nicht empfehlenswert. Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 18

Datenkapselung Einteilung der Eigenschaften/Methoden in 2 Gruppen : öffentlich (public) -> in den aufrufenden Programmen bekannt nicht-öffentlich (private) -> nur innerhalb der Klasse bekannt -> Abkapselung des Innenlebens von der Aussenwelt Anmerkung : ist nichts angegeben ist alles private (private ist default) Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 19

Datenkapselung Objekt private public Daten des Objekts Methode 1 Methode 2 Methode 3 Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 20

Vererbung Aus existierenden (Basis) Klassen könne abgeleitete Klassen erzeugt werden, welche die Eigenschaften und Methoden dieser Basisklasse erben : Bauteil -> Verbraucher -> optisch -> Lampe Eigene Eigenschaften können die Eigenschaften der Basisklasse ergänzen Eigene Methoden können die Methoden aus den Basisklassen ergänzen oder auch überschreiben (=ersetzen). Beispiel : Die Methode anzeigen für ein Objekt der Klasse Bauteil zeigt nur die Eigenschaften an, die da vorgegeben sind. Für eine daraus abgeleitete Klasse benötigt man aber z.b. Lampe zusätzlich, ob die Lampe brennt Schalter zusätzlich, ob ein/aus vorliegt. Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 21

Polymorphie (Vielgestaltigkeit) Wahl der passenden Methode, wenn der Typ (die Klasse) eines Objektes erst zur Laufzeit feststeht. -> Welche Anzeigefunktion ist erforderlich, wenn man erst während des Programmlaufes (z.b. durch Eingabe) entscheidet, ob die Daten einer Lampe oder eines Summers angezeigt werden sollen? -> später genauer Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 22

10.3 Begleitendes Beispiel Auf Kabelrollen sollen unterschiedliche Kabeltypen für den Verkauf zur Verfügung stehen. Alle Längenangaben sind in m. Es soll daher ein Modell für eine Kabelrolle implementiert werden. Erforderliche Daten: Nummer (zur Kennzeichnung) einer Kabelrolle -> (unsigned) int Typ des Kabels -> string Kapazität, d.h. maximale Länge in m -> (unsigned) int Aktuell verfügbare Länge in m -> (unsigned) int Erforderliche Methoden: -Bereitstellen einer leeren Rolle -Eine leere Rolle füllen -Abschneiden eines Stücks. -Ermittlung des Typs auf einer Rolle -Ermittlung der noch vorhandenen Menge -Anzeige aller Daten Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 23

Eigenschaften : kabel_rollennummer kabel_typ kabel_laenge kabel_kapazitaet Kabelrolle : int : string : int : int Methoden Initialisieren einer leeren Rolle (Konstruktor) Anzeigen einer Rolle Typ holen Vorhandene menge holen Abschneiden von einer Rolle Fuellen einer Rolle Kabelrolle kabel_rollennummer:int kabel_typ:string kabel_laenge:int Kabel_kapazitaet:int Kabelrolle(int,int) Anzeigen() holetyp():int holebestand():int abschneiden(int):bool fuellen(int) Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 24

10.4 Verwendung von Dateien Prinzipiell ist es möglich, für die Definition der Klassen und Methoden, sowie das Hauptprogramm eine Quellcodedatei zu verwenden. Klassen werden jedoch üblicherweise in mehreren Programmen/Dateien verwendet. -> Verwendung einer Headerdatei (Endung.h) für die Definition der Klasse -> Verwendung separater Quellcodedateien für die Methoden der Klasse Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 25

Dateien Rolle.h Headerdatei für die Definition der Klasse Rolle.cpp main.cpp Quellcodedatei für die zugehörigen Methoden benötigt #include Kanelrolle.h Quellcodedatei für das Programm benötigt #include Kabelrollee.h -> mehrfaches includieren muss verhindert werden!!!! Durch Verwendung von Präcompiler-Direktiven Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 26

Dateien Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 27

Mehrfaches Includieren Um Mehrfachdefinitionen durch mehrfaches Includieren zu verhindern, werden spezielle Präprozessor-Direktiven verwendet : #ifndef _Klassenname_ // if not defined Klassenname (begrenzt durch 2x _) #define _Klassenname_...// hier ist die Definition inklusive benötigter Dateien (include) #endif // Ende der Definition Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 28

10.5 Definition von Klassen Es wird der Name der Klasse, sowie Namen und Typen der Eigenschaften (Attribute) Name und und Typ der Methoden inkl. des Typs der Parameter (entspricht dem Prototyp) festgelegt und ihre Zuordnung zu private/public. private/public kann beliebig wiederholt werden; default ist private Schema : class Klassenname // beginnt mit Grossbuchstabe private: // hier werden private Eigenschaften und Methoden festgelegt public: // hier werden öffentliche Eigenschaften und Methoden festgelegt };// wichtig: hier ein Semikolon Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 29

// rolle.h #ifndef _Kabelrolle_ #define _Kabelrolle_ #include <string> // Datentyp string using namespace std; class Kabelrolle // Klassendefinition private: unsigned int rollennummer; string typ; unsigned int bestand; unsigned int kapazitaet; Beispiel Kabelrolle public: //Prototypen der Methoden Kabelrolle();//Defaultkonstruktor zur Initialisierung Kabelrolle(int,int); // Konstruktor nummer/kapazitaet bool fuellen(string,int); bool abschneiden(int); void anzeigen(); string gettyp(); unsigned int getbestand(); void setnummer(); }; #endif //Kabelrolle Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 30

10.6 Definition der Methoden Methoden sind Funktionen, welche die Eigenschaften manipulieren. Damit diese Funktionen sich von den normalen Funktionen unterscheiden, wird die Zugehörigkeit zur Klasse durch den Zusatz Klassenname:: vor dem Funktionsnamen ausgedrückt. Dabei ist :: der Bereichsoperator. Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 31

Methoden Zur Deklaration von Methoden wird in der Klassendefinition der Prototyp angegeben. Hier kann auf die Angabe des Bereichsoperators verzichtet werden. class Kabelrolle private: // public: Kabelrolle();//Defaultkonstruktor zur Initialisierung Kabelrolle(unsigned int,unsigned int); // Konstruktor nummer/kapazitaet bool Kabelrolle::fuellen(string,unsigned int); bool abschneiden(unsigned int); void anzeigen(); string gettyp(); unsigned int getbestand(); void setnummer(unsigned int); }; Prototypen Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 32

Methoden In einer Quellcodedatei der Programmcode der Methode angegeben. Hierzu ist die Klassendefinition zu includieren. Hier wird die Zugehörigkeit zur Klasse mit dem Bereichsoperator :: hergestellt #include rolle.h" #include <iomanip> #include <iostream> using namespace std; void Kabelrolle::anzeigen() cout << "\nrolle " <<setw(3)<<setfill('0')<< rollennummer; } cout << "\tkabeltyp "; cout << setw(10) << setfill(' '); // Fuellzeichen cout << typ<< "\tvorhandene Laenge "; cout << setw(4) << right; cout << bestand <<" m (" ; cout << setw(3)<<kapazitaet<<" m)"<<endl; Headerdatei mit der Definition Methoden können dabei auf alle public und privat Eigenschaften public und private Methoden der Klasse direkt zugreifen. Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 33

Methoden Im Main (oder einer anderen Funktion) ist die Klassendefinition zu includieren. Damit steht dort die Klasse mit ihren Methoden zur Verfügung #include rolle.h" using namespace std; void main().. } Headerdatei mit der Definition Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 34

10.7 Arten von Methoden Standardmethoden werden automatisch zur Verfügung gestellt Deklaration eines leeren Objekts Löschen von Objekten Kopieren von Objekten Zuweisung von Objekten -> Defaultkonstruktor -> Destruktor -> Kopierkonstruktor -> = Operator Diese Methoden können aber durch eigene ersetzt (überschrieben) werden. Häufige verwendete Methoden Deklaration und Initialisierung von Objekten-> Konstruktor Bereitstellung (holen) einer Eigenschaft -> get Verändern (setzen) einer Eigenschaft -> set Anzeigen einer oder mehrerer Eigenschaften -> display Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 35

Konstruktoren Um Objekte zu deklarieren und zu initialisieren werden besondere Methoden verwendet: Konstruktoren Konstruktoren haben den Namen der Klasse als Funktionsnamen und sorgen für die Reservierung des benötigten Speicherplatzes und für die Initialisierung der Eigenschaften bei der Deklaration, also für den Aufbau eines Objekts. //Konstruktor für eine leere Rolle Kabelrolle::Kabelrolle(unsigned int p_nummer,unsigned int kapazitaet) rollennummer=p_nummer; typ="leer"; bestand=0; kapazitaet=p_kapazitaet; }; Plausibilitaetskontrollen sind hier möglich aber: Was tun, wenn Daten unzulässig sind? Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 36

Aufruf eines Konstruktors Kabelrolle r1(1212,100), r2(1213,150); Es werden 2 Objekte vom Typ Kabelrolle deklariert mit den Namen r1 und r2 und initialisiert. Die Belegung der Eigenschaften ist: r1 r2 rollennummer 1212 1213 typ leer leer bestand 0 0 kapazitaet 100 150 Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 37

Default-Konstruktor Der Default-Konstruktor ist der Konstruktor ohne Parameter Kabelrolle::Kabelrolle() rollennummer=0; typ="leer"; bestand=0; kapazitaet=0; } //welche Methoden sind hierfuer dann zwingend erforderlich?? Wird ein Default-Konstruktor nicht explizit angegeben, so wird er durch das System automatisch angelegt, wenn kein anderer Konstruktor vorhanden ist. Klassenname::Klassenname() }//dies ist selten sinnvoll; Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 38

Aufruf des Defaultkonstruktors Kabelrolle r3,r4; Es werden 2 Objekte vom Typ Kabelrolle deklariert mit den Namen r1 und r2 und initialisiert. Die Belegung der Eigenschaften ist: r3 r4 rollennummer 0 0 typ leer leer bestand 0 0 kapazitaet 0 0 Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 39

Varianten von Konstruktoren Es können mehrere Konstruktoren in einer Klasse verwendet werden. Diese müssen sich jedoch in ihrer Signatur, d.h. in der Anzahl, Typ und Reihenfolge der Parameter unterscheiden. Mögliche Varianten Kabelrolle(); // Default Konstruktor Kabelrolle(uint p_n, uint p_k); // nummer und kapazitaet Kabelrolle(uint p_n, string p_t, uint p_b, uint p_k);// alle Eigenschaften Am Aufruf erkennt man, welche Methode zu nehmen ist Kabelrolle a, b(21,200), c(25, b222r30,100); Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 40

Destruktor Objekte, die durch einen Konstruktor aufgebaut werden, müssen durch einen Destruktor wieder beseitigt werden. Dies beinhaltet beispielsweise die Freigabe von Speicherplatz, Schließen von Dateien usw.. Üblicherweise wird der Destruktor automatisch angelegt und etwa am Ende eines Blocks automatisch aufgerufen. Eigene Destruktoren werden wie folgt erstellt: Prototyp: ~Klassenname(); Definition: Beispiel ~Kabelrolle(); Klassenname::~Klassenname(); Kabelrolle::~Kabelrolle(); // Programmcode einbauen;. } } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 41

Kopierkonstruktor Bei der Initialisierung eines Objekts kann der Anfangswert durch als Kopie eines existierenden Objekts gewählt werden: cin >>a; int b(a);// b wird so mit dem Wert von a initialisiert. Bei Klassen bedeutet dies, dass eine Kopie des Objekts a unter dem Namen b erstellt wird. Hierfür ist eine spezielle Methode vorgesehen, die automatisch angelegt wird: Kopierkonstruktor. Beispiel Kabelrolle a(117,200), c(a); Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 42

Zuweisung Die übliche (einfache) Form einer Zuweisung ist a=b; Dabei wird der Wert von b der Variablen a zugewiesen, d.h. dort gespeichert. Bei Objekten betrifft dies aber in der Regel alle Eigenschaften. Damit muss der Zuweisungsoperator für auch hierfür erst bereitgestellt werden. Dies ist in der Regel automatisch der Fall. Kabelrolle r(117,200),s; s=r; Anmerkung: Sind in einer Klasse dynamische Objekte/Zeiger enthalten, so muss der Zuweisungsoperator ggf. manuell erstellt werden. Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 43

Zugriff auf einzelne Eigenschaften Häufig ist es erforderlich, den Wert einzelner Eigenschaften zu holen, um weitere Verarbeitungen vorzunehmen. Hierzu verwendet man üblicherweise eine Methode typ geteigenschaft(); Die Definition ist demzufolge: typ Klassenname::getEigenschaft() return Eigenschaft; } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 44

Beispiel get class Kabelrolle private: public: string gettyp(); unsigned int getbestand(); }; string Kabelrolle::getTyp() return typ; } unsigned int Kabelrolle::getBestand() return bestand; } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 45

Zugriff auf einzelne Eigenschaften Häufig ist es erforderlich, den Wert einzelner Eigenschaften zu ändern, d.h. einen neuen Wert zu setzen. Hierzu verwendet man üblicherweise eine Methode void seteigenschaft(typ); Die Definition ist demzufolge: void Klassenname::setEigenschaft(typ neuerwert) Eigenschaft=neuerWert; } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 46

Beispiel set class Kabelrolle private: public: void setnummer(unsigned int); }; void Kabelrolle::setNummer(unsigned int p_nummer) rollennummer=p_nummer; } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 47

Direktzugriff auf einzelne Eigenschaften Sofern eine Eigenschaft (ausnahmsweise) public ist, bzw. wenn innerhalb von Objekten einer Klasse auf Eigenschaften eines anderen Objekts zugegriffen werden soll, kann dies auch direkt über den Punktoperator erfolgen: objektname.eigenschaft Fall 1: Die Eigenschaft typ wäre public statt private Kabelrolle r1(100,100); r1.typ= ac112 ; //setzt den typ auf ac112 cout<<r1.typ<<endl;//anzeige am Bildschirm Damit wären get/set-methoden nicht erforderlich, was aber riskant ist und nicht gemacht werden soll. Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 48

Direktzugriff auf einzelne Eigenschaften Fall 2: In einer Methode wird eine Eigenschaft eines anderen Objekts derselben Klasse benötigt, wenn etwa dieses Objekt Parameter ist. Beispiel: Eine Methode bool testauffuellen(kabelrolle) soll pruefen, ob der Bestand einer Kabelrolle zu einer anderen hinzugefügt werden kann. bool Kabelrolle::testAuffuellen(Kabelrolle p_r) if ( typ == p_r.typ ) if ( bestand + p_r.bestand <= kapazitaet ) return true; else return false; else return false; } Eigenschaften des aufrufenden Objekts Eigenschaften des Parameterobjekts Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 49

Alternative Direktzugriff auf einzelne Eigenschaften bool Kabelrolle::testAuffuellen(Kabelrolle p_r) return ( typ == p_r.typ ) && ( bestand + p_r.bestand <= kapazitaet );} Eigenschaften des aufrufenden Objekts (unten: a) Eigenschaften des Parameterobjekts (unten: b) Kabelrolle a(100,100),b(101,100);. if ( a.testauffuellen(b) ). Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 50

Anzeigen einer oder mehrerer Eigenschaften Häufig (auf jeden Fall für Testzwecke) ist es hilfreich, sich eine, mehrere oder auch alle Eigenschaften eines Objekts anzeigen zu lassen. Also void display(); void displayeigenschaft(); void Klassenname::displayEigenschaft() cout<< Eigenschaft <<Eigenschaft<<endl; } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 51

Anzeigen /Beispiel void Kabelrolle::display() cout << "\nrolle " <<setw(3)<<setfill('0')<< rollennummer; cout << "\tkabeltyp "; cout << setw(10) << setfill(' '); // Fuellzeichen cout << typ<< "\tvorhandene Laenge "; cout << setw(4) << right; cout << bestand <<" m (" ; cout << setw(3)<<kapazitaet<<" m)"<<endl; } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 52

Weitere Methoden Weitere Methoden sind in der Regel klassenabhängig. Für das Beispiel Kabelrolle sind dies die Methoden fuellen und abschneiden bool Kabelrolle::fuellen(string p_typ,unsigned int p_bestand) if ( typ == "leer" && 0<p_bestand && p_bestand<=kapazitaet) typ=p_typ; bestand=p_bestand; return true; } else return false; }; Plausibilitaetskontrollen sichern hier den vernünftigen Einsatz. Daher ist diese Methode vom Typ bool. Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 53

Weitere Methoden bool Kabelrolle::abschneiden(unsigned int p_laenge) if ( 0<p_laenge && p_laenge<=bestand) bestand-=p_laenge; if (bestand==0 ) typ="leer"; return true; } else return false; }; Plausibilitaetskontrollen verhindern auch hier den fehlerhaften Einsatz. Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 54

10.8 Aufruf der Methoden Konstruktoren werden zur Deklaration und Initialisierung der Objekte eingesetzt. Klassenname objektname( ); Kabelrolle a(120,100), b(a); Die anderen public-methoden werden in der Regel mit dem Punkt-Operator aufgerufen objektname.methodenname() // Zugriff auf Methode a.anzeigen(); // Aufruf der Funktion anzeigen für Objekt a b.anzeigen(); // Aufruf der Funktion anzeigen für Objekt b if ( a.fuellen( abc123,100) ) // falls true war das auffuellen der Rolle möglich } if ( a.abschneiden(30) ) // falls true war das abschneiden möglich } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 55

#include "klassen.h" #include <iostream> #include <string> using namespace std; void main() //Test Konstruktoren/display Kabelrolle a(117,200), c[10], d[3]=kabelrolle(20,150)}; a.display(); c[0].display(); d[0].display(); d[1].display(); //Test fuellen unsigned int b,m; string t; cout<<" a fuellen (Typ/Bestand) "; cin >> t>>b; if ( a.fuellen(t,b) ) cout<<" fuellen erfolgreich"<<endl; else cout<<" fuellen nicht erfolgreich"<<endl; a.display(); //Test abschneiden cout<<"\n a abschneiden (Menge) "; cin >> m; if ( a.abschneiden(m) ) cout<<" abschneiden erfolgreich"<<endl; else cout<<" abschneiden nicht erfolgreich"<<endl; a.display(); } Aufruf der Methoden/Beispielprogramm Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 56

10.9 Programmierung von Methoden Zugriff auf Eigenschaften Die Programmierung einer Methode ist prinzipiell wie die Programmierung einer Funktion. Es ist lediglich darauf zu achten, dass die Eigenschaften der Klasse bereits deklariert und direkt darauf zugegriffen werden kann. bool Kabelrolle::fuellen(string p_typ,unsigned int p_bestand) if ( typ == "leer" && 0<p_bestand && p_bestand<=kapazitaet) }; } else typ=p_typ; bestand=p_bestand; return true; return false; Aufruf: a.fuellen( ac112,150) Typ, bestand und kapazitaet sind die Variablen, welche die aktuellen Werte der Eigenschaften des Objekts a enthalten, mit dem die Methode aufgerufen wurde Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 57

Programmierung von Methoden Hervorhebung der Eigenschaften Damit sich die Eigenschaften optisch von den Parametern und lokalen Variablen der Methode unterscheiden, kann man auch den Klassennamen mit dem Bereichsoperator davor setzen. bool Kabelrolle::fuellen(string p_typ,unsigned int p_bestand) if ( Kabelrolle::typ == "leer" && 0<p_bestand && p_bestand<=kabelrolle::kapazitaet) Kabelrolle::typ=p_typ; Kabelrolle::bestand=p_bestand; return true; } else return false; }; Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 58

Programmierung von Methoden Zugriff auf die Eigenschaften anderer Objekte der Klasse Werden andere Objekte derselben Klasse etwa als Parameter übergeben, so muss man dessen Werte von denen des Objekts, mit dem die Methode aufgerufen wurde, unterscheiden. bool Kabelrolle::umfuellen(Kabelrolle) if ( typ == "leer" && 0<p_bestand && p_bestand<=kapazitaet) }; } else typ=p_typ; bestand=p_bestand; return true; return false; Aufruf: a.fuellen( ac112,150) typ und bestand sind die Variablen, welche die aktuellen Werte der Eigenschaften des Objekts enthalten, mit dem die Methode aufgerufen wurde Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 59

10.10 Beispiel 2: Die Klasse Bruch Die Modellierung einer Klasse basiert (bisher) auf Datenabstraktion (Eigenschaften + Methoden) Datenkapselung (public private + private) Üblicherweise sind Eigenschaften private Methoden public Eigenschaften von Bruch zaehler nennen int unsigned int ( wird >0 festgelegt) Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 60

Bruch: Methoden Mittels der Klasse Bruch soll Bruchrechnen möglich sein. -Elementare Rechenoperationen Addition Subtraktion Multiplikation Division + - * / += -= *= /= Ein Bruch sollte stets gekürzt sein. Daher sind nach einer Rechenoperation zaehler und nenner stets zu kürzen, d.h. durch den größten gemeinsamen Teiler zu dividieren. -Vergleiche kleiner kleinergleich groesser groessergleich gleich ungleich Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 61

Bruch: sonstige übliche Methoden anzeigen : alles ( zaehler, nenner) ausgeben getzaehler, getnenner setbruch(zaehler+nenner) Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 62

Bruch: Konstruktoren Defaultkonstruktor Bruch ist Null Konstruktor für alle Eigenschaften zaehler nenner Problem: nenner darf nie 0 sein Konstruktor, der aus einer ganzen Zahl einen Bruch erzeugt Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 63

Bruch: Anwendung Testprogramm, welches alle Methoden testet Funktion summe, welche einen Vektor aus Brüchen summiert Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 64

Bruch/UML Prinzipielle Darstellung Bruch - zaehler: int - nenner: unsigned int + addieren + subtrahieren Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 65

Defaultkonstruktor Bruch::Bruch() // Default-Konstruktor zaehler=0; nenner=1; }; Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 66

Konstruktor für ganze Zahl/bezeichnung Bruch::Bruch(int p_zahl) // Konstruktor für ganze Zahl zaehler=p_zahl; nenner=1; } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 67

Konstruktor fuer zaehler/nenner Bruch::Bruch(int p_zaehler, unsigned int p_nenner) // Konstruktor assert(p_nenner>0); // Nenner muss immer > 0 sein zaehler=p_zaehler; nenner=p_nenner; } Problem: wie kann man verhindern, dass der nenner =0 gesetzt wird. Programmabbruch mittels assert. Aufruf : assert(bedingung) Wenn die Bedingung nicht erfüllt ist bricht das Programm ab. Erforderlich: #include <assert.h> Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 68

Bruch: sonstige übliche Methoden int Bruch::getZaehler() return zaehler; } unsigned int Bruch::getNenner() return nenner; } void Bruch::anzeigen() cout << "\nzaehler "; cout << setw(10); cout << zaehler; cout << "\tnenner "; cout << setw(10); cout << nenner <<endl; } void Bruch::setZaehlerNenner(int p_z,unsigned int p_n) zaehler=p_z; nenner=p_n; } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 69

Bruch: Vergleiche Exemplarisches Beispiel: < z n < p q z q < p n bool Bruch::kleiner(Bruch p_b) return zaehler*p_b.nenner<nenner*p_b.zaehler; } Aufruf: Bruch a(17,5),b(23,8); Alle anderen Vergleiche analog if ( a.kleiner(b) ). Aber: if ( a<b ) wäre schöner/lesbarer Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 70

Bruch: Rechenoperationen Exemplarisches Beispiel : + z n + p q = z q + n q p n Variante 1 Das Ergebnis ist ein neuer Bruch, dessen Wert in einem (dritten) Bruch gespeichert wird, d.h. es enspricht der Schreibweise c=a+b Prototyp: Bruch addiere(bruch) Variante 2 Das Ergebnis überschreibt den Wert eines der Operanden, d.h. es entspricht der Schreibweise a=a+b bzw. a+=b Prototyp: void addieregleich(bruch) (eigentlich Bruch addieregleich ) Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 71

Variante 1 Bruch: Rechenoperationen Prototyp: Bruch addiere(bruch) Bruch Bruch::addiere(Bruch p_b) Bruch temp(zaehler*p_b.getnenner()+p_b.getzaehler*nenner,nenner *p_b.nenner); return temp; } Aufruf: Bruch a(13,4),b(-12,5),c; c=a.addiere(b); Zuweisungsoperator für die Klasse Bruch Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 72

Variante 2 Bruch: Rechenoperationen Prototyp: Bruch addieregleich(bruch) void Bruch::addieregleich(Bruch p_b) Bruch temp(zaehler*p_b.getnenner()+p_b.getzaehler*nenner,nenner *p_b.getnenner); zaehler=temp.getzaehler(); nenner=temp.getnenner(); } Aufruf: Bruch a(13,4),b(-12,5); a.addiere(b); Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 73

Funktion Summe eines Vektors aus Brüchen Für den Typ int Für den Typ Bruch int summe (int n,int v[]) Bruch summe(int n, Bruch v[]) int s=0; Bruch s; for ( int i=0;i<n;i++ ) for ( int i=0;i<n;i++) s+=v[i]; s.addieregleich(v[i]); return s; return s; } } Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 74

class Bruch // Klassendefinition private: int zaehler; int nenner; void kuerzen(); }; Klassendefinition (Zusammenfassung) public: Bruch();// Default-Konstruktor Bruch (int); // Konstruktor fuer ganze Zahl/bezeichnung Bruch (int,unsigned int); // Konstruktor fuer zaehler/nenner/bezeichnung void anzeigen(); Bruch addiere (Bruch); void addieregleich (Bruch); bool kleiner(bruch); unsigned int getnenner(); int getzaehler(); void setzaehlernenner(int,unsigned int); Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 75

void main() Main Bruch summe(int,bruch[]); //Test Konstruktoren get/set/anzeigen Bruch a(5,12),b(3),c; a.anzeigen(); b.anzeigen(); c.anzeigen(); cout<<"\nzaehler/nenner von a "<<setw(4)<<a.getzaehler() <<setw(4)<<a.getnenner()<<endl; c.setzaehlernenner(4,22); c.anzeigen(); //Vergleich cout << "\n a kleiner b \t" << a.kleiner(b)<<endl; cout << "\n b kleiner a \t" << b.kleiner(a)<<endl; //Addition c=a.addiere(b);//c=a+b c.anzeigen(); c.addieregleich(a);//c=c+a c.anzeigen(); } Bruch v[3]=a,b,c}; Bruch s=summe(3,v); s.anzeigen(); Dr. Norbert Spangler / Grundlagen der Informatik 14.12.2006 76