Objektorientierte Programmierung mit C++
←
→
Transkription von Seiteninhalten
Wenn Ihr Browser die Seite nicht korrekt rendert, bitte, lesen Sie den Inhalt der Seite unten
KN 23.05.2019 Objektorientierte Programmierung mit C++ 1. Begriffe Prozedurale Programmierung Objektorientierte Programmierung Sprachen: C, Pascal, Cobol, Basic,... Sprachen: C++, C#, Java... Methode: Methode: - Gesamtproblem in Teilprobleme zerlegen. - die beteiligten Objekte identifizieren - Teilprobleme als Funktion realisieren. - Objekte enthalten Daten und - Daten werden in der jeweiligen Funktion Möglichkeiten diese Daten zu verändern deklariert. Vorteil: Vorteil: schnellere Programme große Programme sind besser wartbar 1 / 22 Uebung_01_KN_2019.doc
KN 23.05.2019 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_2019.doc
KN 23.05.2019 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]; // Daten des Objekts int alter; void ausgabe(void); // Methoden des Objekts void eingabe(void); }; 3 / 22 Uebung_01_KN_2019.doc
KN 23.05.2019 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_2019.doc
KN 23.05.2019 Objekte erzeugen und Daten verändern a) Objekte erzeugen person maier; Deklaration wie in C Objekt erzeugen oder person *mueller; Zeiger deklarieren mueller = new person; dynamisch (wie malloc in C) Zeiger auf dynamisch erzeugtes Objekt b) Methoden ausführen maier.ausgabe(); oder mueller->ausgabe(); d.h.: wie in C: - Zugriff auf eine Komponente einer Datenstruktur - entweder mit Punkt-Operator oder Pfeil-Operator 5 / 22 Uebung_01_KN_2019.doc
KN 23.05.2019 Ü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_2019.doc
KN 23.05.2019 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_2019.doc
KN 23.05.2019 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_2019.doc
KN 23.05.2019 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_2019.doc
KN 23.05.2019 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 „Text“ - Strings → anklicken: „edit strings“ → Text löschen - EditStyle → anklicken und wx_MULTILINE auf TRUE stellen Test: Compile and Run ... 10 / 22 Uebung_01_KN_2019.doc
KN 23.05.2019 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ü) → 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_2019.doc
KN 23.05.2019 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
KN 23.05.2019 mögliches Ergebnis... 13 / 22 Uebung_01_KN_2019.doc
KN 23.05.2019 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_2019.doc
KN 23.05.2019 Vererbungshierarchien: Klasse name Fahrzeugtyp Klasse "person" alter "Fahrzeug" erbt Klasse "arbeiter" Beruf erbt erbt Klasse Zulassungs- datum "Fahrzeughalter" Mehrfachvererbung: Ein Objekt vom Typ „Fahrzeughalter“ enthält die Daten name, alter, Beruf, Fahrzeugtyp und Zulassungsdatum. 15 / 22 Uebung_01_KN_2019.doc
KN 23.05.2019 3.3. Polymorphismus bedeutet: Wirkung der Methode hängt vom Objekt ab Beispiel : maier.ausgabe(); gibt Name und Alter aus datum.ausgabe(); könnte z.B. das aktuelle Datum ausgeben bei C: eine Funktion hat einen eindeutigen Namen, Wirkung ist eindeutig bei C++: 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_2019.doc
KN 23.05.2019 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: class person { public: void ausgabe(void); private: void loeschen(void); }; dann: person maier; maier.ausgabe(); ist erlaubt maier.loeschen(); ist nicht erlaubt ! Sinn: Daten oder Methoden vor Zugriff schützen 17 / 22 Uebung_01_KN_2019.doc
KN 23.05.2019 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_2019.doc
KN 23.05.2019 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); das ist der Destruktor } Definition des Destruktors: person::~person(void) { printf("Objekt wird geloescht"); } d.h. bei der Löschung eines Objektes wird eine Meldung ausgegeben 19 / 22 Uebung_01_KN_2019.doc
KN 23.05.2019 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_2019.doc
KN 23.05.2019 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_2019.doc
KN 23.05.2019 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_2019.doc
Sie können auch lesen