Wenn fertig, bitte Fenster schließen
// Lösung zu Funktionstemplates // Zuerst Dateien einbinden #include <iostream> #include <string> using std::cout; using std::endl; // Funktionstemplate zum Tauschen von Werten beliebigen Datentyps template <typename T> void Swap(T& val1, T& val2) { T temp(val1); // temp mit val1 initialisieren! val1 = val2; // Parameter vertauschen val2 = temp; } // Funktionstemplate zum Sortieren von // beliebigen Datentypen innerhalb eines Feldes // pValues ist der Zeiger auf den Beginn des Datenfeldes // und nNoOfValues enthält die Anzahl der Daten template <typename T> void Sort(T pValues, int const noOfValues) { bool changed; // Tauschflag // Tauschschleife do { // Tauschflag löschen changed = false; // Alle Elemente vergleichen for (int index=0; index<noOfValues-1; index++) { // Falls getauscht werden muss if (pValues[index]>pValues[index+1]) { // Werte tauschen Swap(pValues[index],pValues[index+1]); // Tauschflag setzen changed = true; } } } while (changed); // Schleife so lange durchlaufen, bis nicht mehr getauscht wurde } // Definition der Klasse für die Adressdaten class Address { std::string name; // Name std::string location; // Ort public: Address() // ctor, hat nichts zu tun {} // copy-ctor Address(const Address& obj2); // Adressdaten setzen void SetData(const char* const pN, const char* const pL); // Überladener << Operator für Ausgabe friend std::ostream& operator << (std::ostream& os, const Address& obj2); // Überladener > Operator für Vergleich bool operator > (const Address& obj2) const; // Überladener Zuweisungsoperator Address& operator = (const Address& obj2); }; // Definition der Memberfunktionen // Kopierkonstruktor für lokales Objekt // innerhalb der Templatefunktion Swap(...) Address::Address(const Address& obj2) { name = obj2.name; location = obj2.location; } // Setzen der Adressdaten void Address::SetData(const char* const pN, const char* const pL) { name = pN; location = pL; } // Überladener Operator << für Ausgabe std::ostream& operator << (std::ostream& os, const Address& addr) { os << "Name: " << addr.name; os << " Ort: " << addr.location << endl; return os; } // Vergleichoperator überladen für Vergleich // innerhalb der Templatefunktion Sort(...) inline bool Address::operator > (const Address& obj2) const { return (name > obj2.name); } // Zuweisungsoperator überladen für Zuweisungen // innerhalb der Templatefunktion Swap(...) Address& Address::operator = (const Address& obj2) { if (&obj2 == this) return *this; name = obj2.name; location = obj2.location; return *this; } // main() Funktion int main() { int index; // Schleifenindex // Objektfeld für Adressdaten anlegen const int SIZE = 4; Address *pAddress = new Address[SIZE]; // Objektfeld mit Daten belegen pAddress[0].SetData("Karl Maier","AStadt"); pAddress[1].SetData("Agathe Mueller","XDorf"); pAddress[2].SetData("Xaver Lehmann","CHausen"); pAddress[3].SetData("Berta Schmitt","FStadt"); // unsortiertes Objektfeld ausgeben cout << "Unsortierte Adressen:\n"; for (index=0; index<SIZE; index++) cout << pAddress[index]; // Nun Objektfeld nach Namen sortieren Sort(pAddress,SIZE); // Sortiertes Objektfeld ausgeben cout << "\nSortierte Adressen:\n"; for (index=0; index<SIZE; index++) cout << pAddress[index]; // Objektfeld löschen delete [] pAddress; } |