Objektorientierte Programmierung mit C++

Die Seite wird erstellt Heinrich Thiel
 
WEITER LESEN
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