C++ Kurs

Wenn fertig, bitte Fenster schließen

Lösung zur Lektion "Abgeleitete Klassen"


// Lösung zu abgeleiteten Klassen

// Zuerst Dateien einbinden
#include <iostream>
#include <fstream>
#include <string>

using std::cout;
using std::endl;
using std::string;

// Definition der Adressenklasse
// Enthält der Einfachheit halber nur einen Namen
class Address
{
    string name;
public:
    Address();
    friend std::ostream& operator << (std::ostream& OS, const Address& obj);
    friend std::istream& operator >> (std::istream& IS, Address& obj);
};
// Definition der Memberfunktionen
// Standard-ctor, wird für Objektfeld immer benötigt
Address::Address()
{}
// Gibt Adresse aus
std::ostream& operator << (std::ostream& os, const Address& obj)
{
    os << "Name: ";
    // Falls kein Name vorhanden, irgendwas ausgeben
    if (obj.name.length() == NULL)
        os << "unbekannt!\n";
    // sonst Namen ausgeben
    else
        os << obj.name << endl;
    return os;
}
// Liest Adresse ein
std::istream& operator >> (std::istream& is, Address& obj)
{
    // Ganze Zeile einlesen
    getline(is,obj.name);
    return is;
}
// Von Address abgeleitete Klasse Student
class Student: public Address
{
    string course;
public:
    Student();
    friend std::ostream& operator << (std::ostream& os, const Student& obj);
    friend std::istream& operator >> (std::istream& is, Student& obj);
};
Student::Student()
{}
// Gibt Studentendaten aus
std::ostream& operator << (std::ostream& os, const Student& obj)
{
    // Zuerst Adresse ausgeben
    operator << (os, (Address&)obj);
    // Nun Kurs ausgeben
    os << "Kurs: ";
    // Falls kein Kurs vorhanden, irgendwas ausgeben
    if (obj.course.length() == 0)
        os << "keiner belegt!\n";
    // sonst Namen ausgeben
    else
        os << obj.course << endl;
    return os;
}
// Liest Studentendaten ein
std::istream& operator >> (std::istream& is, Student& obj)
{
    is >> (Address&)obj;
    // Kurs einlesen
    std::getline(is,obj.course);
    return is;
}

// Konstanten für Dateiname und Grösse des Objektfeldes
const char* const pFILENAME = "PERS.DAT";
const int ARRAYSIZE=3;

// main() Funktion
int main()
{
    int index;             // Schleifenindex
    Student *pAddr;        // Zeiger für Objektfeld

    // Objektfeld erstellen
    pAddr = new Student[ARRAYSIZE];

    // Nun die Namen von der Tastatur einlesen
    cout << "Bitte Studenten-Daten eingeben.\n";
    cout << "Zuerst den Namen und dann den Kurs.\n";
    cout << "Beide Angaben bitte in getrennten Zeilen!\n";
    for (index=0; index<ARRAYSIZE; index++)
    {
        cout << index+1 << ". Name:";
        // Student einlesen
        std::cin >> pAddr[index];
    }

    // Zur Kontrolle die eingelesenen Daten ausgeben
    cout << "\nGespeicherte Daten:\n";
    for (index=0; index<ARRAYSIZE; index++)
        // Adresse ausgeben
        cout << pAddr[index];

    // Nun Daten in Datei ablegen
    cout << "Speichere Daten jetzt in Datei " << pFILENAME << endl;
    // Datei öffnen
    std::ofstream outFile;
    outFile.open(pFILENAME);
    // Falls Datei erfolgreich geöffnet
    if (outFile)
    {
        // Daten ablegen
        for (index=0; index<ARRAYSIZE; index++)
            outFile << pAddr[index];
        outFile.close();
    }
    else
        cout << "Fehler beim Öffnen der Datei!\n";

    // Objektfeld löschen
    delete [] pAddr;
}