// Im diesem Beispiel sind die Basisklasse und die
// davon abgeleiteten Klassen in verschiedenen
// Moduldatei definiert

#include <iostream>
#include <fstream>
#include <string>

import ArtikelType;

constexpr int SIZE = 3;     // Groesse des Artikelfeldes

// main() Funktion
int main()
{
    // Feld fuer Zeiger auf Monitor-Objekte
    Artikel *pLager[SIZE];

    // 3 Artikel definieren
    pLager[0] = new Monitor("ASUS", 27);
    pLager[1] = new Keyboard("Microsoft", Keyboard::DE);
    pLager[2] = new Monitor("Alienware", 32);

    // Daten ausgeben
    for (auto elem : pLager)
    {
        // Je nach Typ die entsprechende Ausgabe aufrufen
        // Dazu muss der Basisklassenzeiger bis jetzt noch
        // explizit auf den richtigen Typ konvertiert werden damit
        // der richtige ueberladene Operator aufgerufen wird
        if (elem->GetType() == 'M')
            std::cout << static_cast<Monitor&>(*elem);
        else
            std::cout << static_cast<Keyboard&>(*elem);
    }

    // Daten in Datei ablegen
    std::ofstream outFile("c:/temp/xxx.txt");
    if (!outFile)
    {
        std::cout << "Fehler beim Oeffnen der Datei!!\n";
    }
    else
    {
        for (auto elem : pLager)
        {
            outFile << elem->GetType() << ": ";
            if (elem->GetType() == 'M')
                outFile << static_cast<Monitor&>(*elem);
            else
                outFile << static_cast<Keyboard&>(*elem);
        }
        // Datei auch wieder schliessen!
        outFile.close();
    }
        
    // Artikel im Feld wieder loeschen!
    for (auto& elem : pLager)
        delete elem;
}
