Wenn fertig, bitte Fenster schließen
// 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; } |