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