C++ Kurs

Wenn fertig, bitte Fenster schließen

Lösung 2 zur Lektion "Dynamische Eigenschaften und Objekte"


// Lösung zu dynamischen Objekten und Objektfelder

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

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

// Konstanten
const char *const pFILENAME = "winarray.dat"; // Datei mit Fensterdaten

// Klassendefinition
class Window
{
    int     xPos, yPos;        // Position
    int     width, height;     // Grösse
    string  *pTitle;           // Titel
  public:
    // Konstruktor
    Window()
    {
        cout << "Speicher für Fenster reserviert.\n";
        // Immer eine gute Idee: Zeiger mit NULL initialisieren
        pTitle = NULL;
    }
    // Destruktor
    ~Window()
    {
        cout << "Speicher für Fenster freigegeben\n";
        // Speicher für Fenstertitel freigeben!
        delete pTitle;
    }
    void Print () const;
    bool ReadFromFile(ifstream&);
};
// Definition der Memberfunktionen
// Fensterdaten ausgeben
void Window::Print() const
{
    cout << "Fenster : \'" << *pTitle << "\'\n";
    cout << "Position: " << xPos << "," << yPos << endl;
    cout << "Grösse : " << width << "," << height << endl;
}
// Liest ein Fensterdaten aus der uebergebenen Datei ein
bool Window::ReadFromFile(ifstream& inFile)
{

    // Fensterposition
    // Fehlerhaftes Dateiende abfangen!
    inFile >> xPos >> yPos;
    if (inFile.eof())
        return false;
    // Fenstergrösse einlesen
    inFile >> width >> height;
    // string Objekt für Fenstertitel dyn. anlegen
    pTitle = new string;
    // Fenstertitel einlesen
    std::getline(inFile,*pTitle);
    return true;
}

// main() Funktion
int main()
{
    ifstream    winFile;           // Datei mit den Fensterdaten
    int         noOfWin;           // Anzahl der Fensterdaten i.d. Datei
    int         index;             // Schleifenindex
    Window      *pWindow;          // Zeiger auf Fensterfeld

    // Datei mit Fensterdaten öffnen
    winFile.open(pFILENAME);
    if (!winFile)
    {
        cout << "Fehler beim Öffnen der Datei " << pFILENAME << endl;
        exit(1);
    }

    // Anzahl der Fensterdaten einlesen
    winFile >> noOfWin;

    // Feld für die Fensterdaten anlegen
    pWindow = new Window[noOfWin];

    // Nun alle Fensterdaten aus Datei einlesen
    for (index=0; index<noOfWin; index++)
    {
        bool success = pWindow[index].ReadFromFile(winFile);
        // Fehler abfangen!
        if (!success)
        {
            cout << "Fehler beim Einlesen des " << index+1 << ". Fensters!\n";
            // Anzahl der Fenster korrigieren und Schleife verlassen
            noOfWin = index;
            break;
        }
    }

    // Datei nun wieder schliessen
    winFile.close();

    // Alle Fensterdaten ausgeben
    for (index=0; index<noOfWin; index++)
        pWindow[index].Print();

    // Feld mit Fensterdaten löschen
    // Unbedingt die eckigen Klammern beachten!!
    delete [] pWindow;

}