Klassenschablonen



  • Hallo.

    Mal abgesehen davon, dass ich generelle Probleme habe, mir C++ beizubringen, habe ich hier ein Programm, das ich nicht so ganz verstehe. Kann mir jemand den folgenden Code klar und nachvollziehbar analysieren (bitte so "deutsch" wie möglich)?

    // template6.cpp - Ein Beispiel für Klassen-Templates
    #include <iostream.h>
    
    #define MAX_ELEMENTE 100
    
    template <class T>
    class List
    {
    private:
      T elemente[MAX_ELEMENTE];
      int count;
    public:
      List();
    
      int getCount();
      bool addElement(T elem);
      T elementAt(int index);
    };
    
    template <class T>
    List<T>::List()
    {
        count = 0;
    }
    
    template <class T>
    int List<T>::getCount()
    {
        return count;
    }
    
    template <class T>
    bool List<T>::addElement(T elem)
    {
        if (count == MAX_ELEMENTE) return false;
    
        elemente[count] = elem;
        count++;
    
        return true;
    }
    
    template <class T>
    T List<T>::elementAt(int index)
    {
        return elemente[index];
    }
    
    void main()
    {
        List<int> integerList;
    
        integerList.addElement(3);
        integerList.addElement(6);
    
        cout << "Anzahl: " << integerList.getCount() << endl;
        cout << "Element[0]:" << integerList.elementAt(0) << endl;
    }
    

    Desweiteren suche ich nach Übungen, die wirklich für den Anfänger geeignet sind und für die auch Lösungen zur Verfügung stehen. Bisher konnte ich sowas nicht finden.

    Danke im Voraus. 🙂



  • Was genau ist dir unklar? Vielleicht solltest du ein gutes Buch schnuppern, under www.c-plusplus.net gibt's ne gute Bücherecke 😉



  • Als erstes hast Du hier eine Template Klasse vor dir. Eine Template Klasse ist eine Schablone, eine Vorlage, die für alle Typen.

    template<class T>
    

    "T" steht dann für den Typ, den man bei der Instanziierung angibt. Das macht man dann etwa so

    List<int>
    

    Um bei deiner Klasse zu bleiben 😉 "int" wird nun überall dort eingesetzt wo "T" steht. Damit wird der großteil des Codes schon leserlicher 🙂

    template <class T>
    List<T>::List()
    {
        count = 0;
    }
    

    Was passiert hier? Nun es gibt Template Klassen und es gibt Template Funktionen. Wenn die Methoden außerhalb der Klasse Implementiert werden, muss man ihnen den Template Parameter erst bekannt machen. Übrigens, die Definition einer Template Funktion sieht fast genau so aus;)

    template<class T> T MyFunktion(const T&) {}
    

    Den Template Parameter (im Beispiel immer "T") kann man wie einen ganz Normalen Type behandeln. Mit allem was so dazu gehört.



  • Danke.
    Jetzt habe ich wenigstens den Template-Teil verstanden.

    Was ich aber nicht verstehen kann, ist die Ausgabe:
    Anzahl: 2
    Element[0]:3

    Es wäre nett, wenn mir noch jemand erklären würde, wie es dazu kommt. 🙂



  • In einem Array fängt man immer bei 0 an zu Zählen und nicht bei 1.

    Das liegt daran, das ein Zugriff wie dieser

    int i[5];
    i[2] = 4;
    

    gleich diesem ist

    int i[5];
    *(i+2) = 4;
    

    Die Variable i ist die Startadresse des Array's und der Wert in den Klammern [] wird zu der Startadresse aufaddiert. Ergo bedeutet i+0 = Startaddresse oder auch erster Wert.


Anmelden zum Antworten