28.11.2018 – Modularisierung: Strukturen (struct), Klassen (class) und Bibliotheken

Beispiellösung der Hausaufgabe

#include <iostream>

using namespace std;

/*
 * int variable;
 * int *pointer = &variable;
 *
 *
 */

bool askUserInformations(string *vorname, int *schuhgroesse);
bool isValidSchuhgroesse(int schuhgroesse);

bool askUserInformations(string *vorname, int *schuhgroesse) {

    cout << "Bitte geben Sie Ihren Vornamen ein: ";
    cin >> *vorname;

    cout << endl;

    cout << "Bitte geben Sie Ihre Schuhgröße ein: ";

    cin >> *schuhgroesse;

    return isValidSchuhgroesse(*schuhgroesse);
}

bool isValidSchuhgroesse(int schuhgroesse) {

    /*
    Innerhalb der Funktion (askUserInformations) wird die Funktion
     isValidSchuhgroesse aufgerufen, die prüft, ob die eingegebene Schuhgröße
     im Bereich von 29 bis 52 (schuhgroesse >= 29 && ...) ist. Liegt die eingegebene
     Schuhgröße außerhalb dieses Bereiches, so soll die Funktion (askUserInformations)
     den booleschen Wert "false" zurückgeben. Liegt die eingegebene Schühgröße innerhalb
     dieses Bereiches, so soll die Funktion (askUserInformations) den booleschen Wert "true"
     zurückgeben.
    */

    if (schuhgroesse >= 29 && schuhgroesse < 52) {
        return true;
    } else {
        return false;
    }

    // Kurzform:
    // return (schuhgroesse >= 29 && schuhgroesse < 52);
}

int main() {

    /*
    int variable;
    int *pointer = &variable;
     */

    string vorname;
    int schuhgroesse;

    /*
     In main soll auf den Rückgabewert der Funktion reagiert werden: Geben Sie bei
     false eine beliebige Meldung aus, geben Sie bei true eine beliebige
     (von Meldung #1 unterschiedene) Nachricht aus.

Geben Sie alle Informationen, die über die Funktion eingegeben wurden schließlich
     in Ihrer Hauptfunktion aus.
     */

    // bool askUserInformations(string *vorname, int *schuhgroesse) {
    bool keinKinderfuss = askUserInformations(&vorname, &schuhgroesse);

    cout << vorname << endl;

    if (keinKinderfuss) {
        cout << "Wir haben Schuhe für Sie im Angebot.";
    } else {
        cout << "Keine Kinderschuhe vorrätig.";
    };

    return 0;
}

Code zu Strukturen, Klassen und Bibliotheken

main.cpp

#include <iostream>

#include "lib/pizza.h"

using namespace std;

// Anno Pief: stammen aus C
// Eine Struktur, die eine oder mehrere "Personen" repräsentiert
// bzw. Blaupause für eine oder mehrere "Personen"
// Abstrakt
struct person {

    string vorname;
    string nachname;
    string geburtsdatum;
    string wohnort;
    int schuhgroesse;
};

int main() {

    // Konkret: Erstellung einer Instanz einer Struktur
    struct person superStudent;

    superStudent.vorname = "Philipp";
    superStudent.nachname = "Engel";
    superStudent.geburtsdatum = "23. Oktober 2000";
    superStudent.wohnort = "Köln";
    superStudent.schuhgroesse = 42;

    cout << "Hallo " << superStudent.vorname << " " << superStudent.nachname
         << " aus " << superStudent.wohnort << "!";

    // Pizza, mangia e vai!
    class pizza funghi;

    funghi.preis = 6;
    funghi.setZutaten("Pilze, Teig, Käse.");
    // Testen
    // Automatisiertes Testen, z.B.:
    // - unit-Tests: interne Tests
    // - e2e Tests: Tests gegen das Benutzerinterface
    /*
    funghi.setDurchmesser(32);
    funghi.setDurchmesser(80);
     */

    return 0;
}

pizza.h

#include <iostream>

using namespace std;

// Klasse pizza ist Blaupause für konkrete pizza-Objekte
// Klassen realisieren im Idealfall das Prinzip des Information Hiding:
// Wir stellen Benutzern unserer Klasse Schnittstellen bereit, um mit Eigenschaften der
// Klasse zu interagieren
class pizza {

    // öffentlicher Teil
public:

    // Konstruktor
    // wird aufgerufen bei Instanziierung einer Klasse
    pizza() {
        cout << "*** KONSTRUKTOR ***" << endl;
    }

    // Destruktor
    // wird aufgerufen bei Beendigung des Lebenszyklus der Klasse
    ~pizza() {
        cout << "*** DESTRUKTOR ***" << endl;
    }

    // Getter (liefern relevante Informationen zurück)
    string getZutaten();
    float getDurchmesser();

    // Setter
    // Inline-Definition
    void setZutaten(string leckerSachen) {

        // this: Verweis auf Element / Eigenschaft der Klasse
        this->zutaten = leckerSachen;
    };
    void setDurchmesser(float umfang) {

        if (umfang > 40 || umfang < 20) {
            cout << "Keine gute Pizzagröße";
            this->durchmesser = 32.715;
        } else {
            this->durchmesser = umfang;
        }
    };

    float preis;

    // privater Teil
private:
    // Membervariablen
    // Eigenschaften einer Pizza
    string zutaten;
    float durchmesser;
    bool steinofen;

    // geschützter Bereich: Zugänglich von dieser Klasse und assoziierten Klassen
protected:
};