C++ Kurs

Wenn fertig, bitte Fenster schließen

Lösung zur Lektion "Funktions-Templates"


// 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;
}