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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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 → mitKN 23.05.2019
mögliches Ergebnis...
13 / 22 Uebung_01_KN_2019.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docKN 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.docSie können auch lesen