Wenn fertig, bitte Fenster schließen
// Lösung zu überladenen Memberfunktionen // Dateien einbinden #include <iostream> #include <cstring> using std::cout; using std::endl; // Klassendefinition class CString { char *pString; // String short stringNum; // akt. String-Nummer static short count; // laufende String-Nummer public: // ctor CString(); // dtor ~CString(); // String setzen void SetString(const char *const pS); void SetString(const CString& source); // Strings addieren void AddString(const char *const pS); void AddString(const CString& add); // String ausgeben void Print() const; }; // Statische Eigenschaft definieren! short CString::count; // Definition der Memberfunktionen // Konstruktor CString::CString() { // char-Feld mit einem Element anlegen pString = new char[1]; // String als leeren String kennzeichnen pString[0] = 0; // Stringzähler erhöhen count++; // Und aktuelle Nummer merken stringNum = count; } // Destruktor CString::~CString() { // Speicher für char-Feld freigeben! delete [] pString; count--; } // Legt den über den char-Zeiger übergebenen String ab void CString::SetString(const char *const pS) { // Zuerst alten Speicherplatz freigeben! delete [] pString; // Nun neuen Speicherplatz für String anfordern // Die abschliessende binäre 0 dabei nicht vergessen! pString = new char[strlen(pS)+1]; // String umkopieren strcpy(pString,pS); } // Legt den über die String-Referenz übergebenen String ab void CString::SetString(const CString& source) { // Gleicher Ablauf wie bei der vorherigen Memberfunktion delete [] pString; pString = new char[strlen(source.pString)+1]; strcpy(pString,source.pString); } // Fügt den über den char-Zeiger übergebenen String hinzu void CString::AddString(const char *const pS) { char *pTemp; // Hilfszeiger // Zuerst Speicher für neuen String reservieren pTemp = new char[strlen(pString)+strlen(pS)+1]; // Dann den ursprünglichen String umkopieren strcpy(pTemp,pString); // und nun den neuen String hinzufügen strcat(pTemp,pS); // Jetzt erst den ursprünglichen Speicher freigeben delete [] pString; // und Zeiger auf neuen Speicherbereich setzen pString = pTemp; } // Fügt den über die String-Referenz übergebenen String hinzu void CString::AddString(const CString& add) { char *pTemp; // Hilfszeiger // Gleicher Ablauf wie vorherige Memberfunktion pTemp = new char[strlen(pString)+strlen(add.pString)+1]; strcpy(pTemp,pString); strcat(pTemp,add.pString); // Jetzt erst den ursprünglichen Speicher freigeben delete [] pString; // und Zeiger auf neuen Speicherbereich setzen pString = pTemp; } // Ausgabe des Strings void CString::Print() const { cout << stringNum << ".String: " << pString << endl; } // main() Funktion int main() { // Zwei String Objekte definieren CString myString1, myString2; // Ersten String mit char-String anlegen myString1.SetString("Es waren "); // Beide Strings ausgeben cout << "\nAusgangs-Strings\n"; myString1.Print(); myString2.Print(); // Zum ersten String Objekt char-String hinzufügen myString1.AddString("zwei Ameisen"); // Zum zweiten String Objekte char-String hinzufügen myString2.AddString("die wollten nach Amerika reisen"); // Beide Strings ausgeben cout << "\nNach AddString(...)\n"; myString1.Print(); myString2.Print(); // Neues String definieren CString myString3; // Mit ersten String Objekt anlegen myString3.SetString(myString1); // Zeilenvorschub in String einfügen myString3.AddString("\n"); // und zweites String Objekt hinzufügen myString3.AddString(myString2); // Neues String Objekt jetzt ausgeben cout << "\nNeuer String\n"; myString3.Print(); } |