1. Begriffe Objektorientierte Programmierung mit C++ Prozedurale Programmierung Sprachen: C, Pascal, Cobol, Basic,... Objektorientierte Programmierung Sprachen: C++, C#, Java... Methode: - Gesamtproblem in Teilprobleme zerlegen. - Teilprobleme als Funktion realisieren. - Daten werden in der jeweiligen Funktion deklariert. Vorteil: schnellere Programme Methode: - die beteiligten Objekte identifizieren - Objekte enthalten Daten und Möglichkeiten diese Daten zu verändern Vorteil: Literatur: RRZN-Skript C++ für C-Programmierer große Programme sind besser wartbar 1 / 22 Uebung_01_KN_2015
2. Vergleich von C und C++ C++ existiert seit ca. 1983 Compiler: Borland C++, IBM xlc, gcc (GNU C++) C++ wird von ANSI (American National Standardisation Institute) standardisiert C++ ist eine Erweiterung von C d.h. C-Programme können vom C++ Compiler übersetzt werden es gibt a) nicht objektorientierte Erweiterungen z.b.: strengere Typenkontrolle (Typ muß immer angegeben werden) Kommentarzeichen // neue Möglichkeiten für Funktionen etc... b) objektorientierte Erweiterungen z.b.: Einführung von Klassen und Vererbungsmechanismen 2 / 22 Uebung_01_KN_2015
3. Begriffe der objektorientierten Programmierung 3.1 Objekt und Klasse Objekt ist eine Struktur die Daten- und Methoden (=Funktionen) enthält. Klasse ist der Typ eines Objektes. Beispiel: class person { char name[20]; int alter; void ausgabe(void); void eingabe(void); // Daten des Objekts // Methoden des Objekts }; 3 / 22 Uebung_01_KN_2015
Abweichung gegenüber C: - Methoden (Funktionen) sind einem Objekt zugeordnet. - Methoden verändern die Daten des Objektes. bisher: Funktionen konnten von überall aufgerufen werden nun: Kapselung ( information hiding ) Daten und ihre Verarbeitung sind im Objekt konzentriert (bisher: verstreut) = Vorteil bei großen Projekten bisher: Daten waren im ganzen Programm manipulierbar nun: Interaktion über definierte Schnittstellen Daten werden durch Aufruf einer Methode verändert Implementierung ist verborgen 4 / 22 Uebung_01_KN_2015
a) Objekte erzeugen Objekte erzeugen und Daten verändern oder person maier; Deklaration wie in C Objekt erzeugen person *mueller; Zeiger deklarieren mueller = new person; dynamisch (wie malloc in C) Zeiger auf dynamisch erzeugtes Objekt b) Methoden ausführen oder d.h.: wie in C: maier.ausgabe(); mueller->ausgabe(); - Zugriff auf eine Komponente einer Datenstruktur - entweder mit Punkt-Operator oder Pfeil-Operator 5 / 22 Uebung_01_KN_2015
Übung: Windows-Anwendung in C++ erstellen Windows ist eine graphische Benutzeroberfläche = GUI = Graphical User Interface Es gibt diverse Entwicklungsumgebungen für GUI-Programmierung in C++ hier: wxwidgets (= C++ Klassen) in Verbindung mit wxdevcpp (= Compiler) Vorteil: Cross-Plattform-Development (= für mehrere Betriebssysteme) Web-Links: wxwidgets http://de.wikipedia.org/wiki/wxwidgets Erläuterung (deutsch) http://www.wxwidgets.org/ Homepage (englisch) wxdevcpp http://de.wikipedia.org/wiki/orwell_dev-c%2b%2b (deutsch) http://wxdsgn.sourceforge.net/ Homepage (englisch) Buch: Julian Smart: Cross-Platform GUI Programming with wxwidgets 6 / 22 Uebung_01_KN_2015
1. Schritt: Anwendungsgerüst erstellen - Als Nutzer knxx (d.h. kn + PC-Nummer, z.b. kn13 ) anmelden - Ordner Programmieren anklicken - wxdevcppp7-64 (Symbol) anklicken - Datei Neu Projekt anklicken, dann wxwidgetsframe wählen - dann einen Namen ausdenken (z.b. TasteUndText = Name der Anwendung) - o.k. klicken - dann neues Verzeichnis erstellen (auf USB-Stick oder Desktop Benutzerbereich) - dort die *.dev Datei abspeichern - dann erscheint das Fenster Neuer wxframe - dort alle Einstellungen übernehmen und auf create klicken - es erscheint die Darstellung eines Fensters Test: - das neu erstellte Projekt übersetzen und starten (F9 oder compile and run ) es sollte ein Anwendungsfenster erscheinen, das man mit der Maus schließen kann 7 / 22 Uebung_01_KN_2015
Analyse des Quellcodes: Die Anwendung besteht aus zwei Objekten: App = Application Es gibt: ein Anwendungsobjekt TasteUndTextApp (Klasse: wxapp).cpp Datei Frm = Frame ein Fensterobjekt TasteUndTextFrm (Klasse: wxframe).cpp Datei dazu: zwei Header-Dateien: TasteUndTextApp.h TasteUndTextFrm.h und: graphische Darstellung des Anwendungsfensters: TasteUndTextApp.wxform (= ein Tool zum Entwurf der Nutzeroberfläche mit der Maus) und Resource Definitions : TasteUndText.rc = Grafikelemente, Cursor, Icons etc. 8 / 22 Uebung_01_KN_2015
Schritt 2: Taste (Schaltfläche) und Textfenster der Anwendung hinzufügen Taste: im Components Fenster (auf dem Bildschirm rechts) - Common Controls (allgemeine Kontrollobjekte) mit Doppelklick öffnen - wxbutton anklicken und dann im Formularfenster mit der Maus platzieren (mit gedrückter linker Maustaste einen Positionsrahmen erzeugen) Textfenster: im Components Fenster (auf dem Bildschirm rechts) - Common Controls (allgemeine Kontrollobjekte) mit Doppelklick öffnen - wxedit (oder: wxtextctrl) anklicken und dann mit der Maus platzieren (mit gedrückter linker Maustaste einen Positionsrahmen erzeugen) Test: Anwendung übersetzen und starten (F9) Taste kann angeklickt werden, Texteingabe und Editieren ist möglich 9 / 22 Uebung_01_KN_2015
Schritt 3: Taste und Textfenster anpassen Ziel: Beschriftung und Initialisierung der Grafikelemente anpassen Taste: - mit der Maus die Taste im Formularfenster (wxform) anklicken - im Property Inspector (Bildschirm links unten) Properties auswählen - Name ändern in Taste - Label ändern in bitte anklicken Textfenster: - mit der Maus das Textfenster im Formularfenster (wxform) anklicken - im Property Inspector (Bildschirm links unten) Properties auswählen - Name ändern in Taste - Strings anklicken: edit strings Text löschen Test: Compile and Run... 10 / 22 Uebung_01_KN_2015
Schritt 4: Tastenfunktion einbauen Bei Tastatureingabe soll im Textfenster angezeigt werden, wie oft die Taste angeklickt worden ist. Hinweis: Maus, Tastatur u.a. erzeugen events = Ereignisse Diese werden in event-tables (Ereignistabellen) mit Funktionen verknüpft Taste: - mit der Maus die Taste im Formularfenster (wxform) anklicken - im Property Inspector (Bildschirm links unten) Events auswählen - OnClick auswählen anklicken - im Fenster daneben (pull down Menü) <Add New Function> anklicken - es öffnet sich der Quellcode TasteUndTextFrm.cpp, dort gibt es nun eine Funktion TasteUndTextFrm::TasteKlick() im Bereich: insert your code here kann nun programmiert werden... 11 / 22 Uebung_01_KN_2015
Vorschlag: - eine statische Variable deklarieren ( zaehler ) - diese zu Beginn auf 1 setzen - den Zähler und den Text. Tastenklick ausgeben + Zeilenumbruch - Zähler inkrementieren Hinweise: statische Ganzzahlvariable static int Inkrementieren mit ++ Text im Textfenster ausgeben mit << Operator (Ausgabeoperator) static int zaehler = 1; *text << zaehler <<. Tastenklick\n ; zaehler++; 12 / 22 Uebung_01_KN_2015
mögliches Ergebnis... 13 / 22 Uebung_01_KN_2015
3.2. Vererbung Klassen können aus bereits definierten Klassen abgeleitet werden = Ableitung, Vererbung abgeleitete Klasse - hat die gleichen Daten und Methoden der Basisklasse - kann Methoden hinzufügen oder ändern - kann Daten hinzufügen Vorteil: bereits erprobte Programmteile können übernommen werden Beispiel: class arbeiter: public person { char beruf[50]; } das ist die Definition der Klasse arbeiter Ein Objekt vom Typ Arbeiter enthält die Daten name, alter (aus der Klasse person geerbt) und beruf 14 / 22 Uebung_01_KN_2015
Vererbungshierarchien: Klasse "person" name alter Fahrzeugtyp Klasse "Fahrzeug" erbt Klasse "arbeiter" Beruf erbt erbt Zulassungsdatum Klasse "Fahrzeughalter" Mehrfachvererbung: Ein Objekt vom Typ Fahrzeughalter enthält die Daten name, alter, Beruf, Fahrzeugtyp und Zulassungsdatum. 15 / 22 Uebung_01_KN_2015
3.3. Polymorphismus bedeutet: Wirkung der Methode hängt vom Objekt ab Beispiel : maier.ausgabe(); datum.ausgabe(); gibt Name und Alter aus könnte z.b. das aktuelle Datum ausgeben bei C: bei C++: eine Funktion hat einen eindeutigen Namen, Wirkung ist eindeutig Methoden in unterschiedlichen Klassen können gleichen Namen haben weitere Anwendung: Operatoren können überladen werden d.h. Wirkung eines Operators kann selbst definiert werden Beispiel: + Operator um Strings aneinanderzuhängen 16 / 22 Uebung_01_KN_2015
4. Klassen definieren und Objekte erzeugen 4.1 Daten und Methoden schützen Prinzip: Nicht alle Methoden sollen von außen aufgerufen werden können Einteilung in public (von außen zugänglich) und private. Beispiel: dann: class person { public: void ausgabe(void); private: void loeschen(void); }; person maier; maier.ausgabe(); ist erlaubt maier.loeschen(); ist nicht erlaubt! Sinn: Daten oder Methoden vor Zugriff schützen 17 / 22 Uebung_01_KN_2015
4.2 Konstruktoren = eine Methode (Funktion) zum Initialisieren des Objektes (Anfangswerte zuweisen). wird automatisch bei der Erzeugung eines Objektes aufgerufen. hat den gleichen Namen wie die Klasse selbst. Beispiel: class person { char name[20]; person("unbekannt"); } das ist der Konstruktor Definition des Konstruktors (Operator :: bewirkt die Zuordnung zur Klasse) person::person(char *text) { strcpy(name,text); } d.h. bei der Erzeugung eines Objektes der Klasse person wird der name initialisiert 18 / 22 Uebung_01_KN_2015
4.3 Destruktoren = Methode die ausgeführt wird, wenn ein Objekt entfernt wird wird automatisch bei der Löschung eines Objektes aufgerufen. hat den Namen der Klasse mit einem ~ Zeichen davor Beispiel: class person { char name[20]; ~person(void); } Definition des Destruktors: das ist der Destruktor person::~person(void) { printf("objekt wird geloescht"); } d.h. bei der Löschung eines Objektes wird eine Meldung ausgegeben 19 / 22 Uebung_01_KN_2015
4.4 Steuerung des Vererbungsmechanismus 4.4.1 Deklaration abgeleiteter Klassen Beispiel: Ableitung der Klasse x aus zwei Klassen y und z: class x: public y, public z {... };... public y... bedeutet: Zugriffsrechte in y bleiben auch in z erhalten d.h. public bleibt public, private bleibt private Problem: Methoden aus x können nicht auf private-daten in y zugreifen deswegen: dritte Art von Zugriffsrecht: protected d.h.: Daten in der Basisklasse als protected deklarieren dann kann auch eine abgeleitete Klasse darauf zugreifen und: von außen ist kein Zugriff möglich 20 / 22 Uebung_01_KN_2015
4.4.2 Möglichkeiten der Ableitung von Klassen a) class x: public y... die in y zugeordneten Zugriffsrechte bleiben erhalten aus x kann auf public und protected Komponenten zugegriffen werden b) class x: protected y... in y als public deklarierte Komponenten sind in x nun protected aus x kann nur auf public Komponenten von y zugegriffen werden c) class x: private y... alle Komponenten von y erhalten das Zugriffsrecht private aus x kann auf keine Komponente von y zugegriffen werden meist wird mit public abgeleitet. 21 / 22 Uebung_01_KN_2015
Zusammenfassung Objektorientierte Programmierung = Daten und Methoden zusammenfassen Klasse ist der Typ eines Objektes (ähnlich einer Datenstruktur in C) Methoden = Funktionen eine Objektes Vererbung = neue Klassen können von existierenden Klassen abgeleitet werden Daten und Methoden der Basisklasse werden übernommen existierende Klassen können weiterverwendet und erweitert werden Konstruktoren und Destruktoren = Objekte initialisieren und löschen Zugriffsrechte: public, protected und private steuern den Zugriff von außen auf die Daten des Objektes steuern die Vererbung von Zugriffsrechten 22 / 22 Uebung_01_KN_2015