Objektorientierte Programmierung mit C++ - Elektrotechnik

Objektorientierte Programmierung mit C++ - Elektrotechnik Objektorientierte Programmierung mit C++ - Elektrotechnik

elektrotechnik.fh.gelsenkirchen.de
von elektrotechnik.fh.gelsenkirchen.de Mehr von diesem Publisher
05.10.2013 Aufrufe

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

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!