next up previous contents index
Next: Klassen-Hierarchien und Vererbung Up: Schablonen Previous: Funktionsschablonen

Klassenschablonen

        Ziel: Definition generischer Klassen

Beispiel:

    template <class T, int size> class array
    { private : T inhalt[size];
      public:   array(T);
                void print();
                int getsize() {return size;}
    };
    template <class T, int size> 
    array<T,size>::array(T elemval)
    { for (int i = 0; i < size; i++)
        inhalt[i] = elemval;
    }
    template <class T, int size> 
    void array<T,size>::print()
    { for (int i = 0; i < size; i++)
        cout << inhalt[i] << " ";
    }
    
    int main()
    { array<char,10> carray('p');
      carray.print();
      array<double,7> darray(12.0);
      darray.print();
    }

Ein vollständiges Beispiel

#include <iostream.h>

template <class T>      // declaration tset
class tset;             // (forward)

template <class T>      // definition elem
class elem
{ friend class tset<T>; // tset uses these linked
private:                // lists to represent sets
  T val;                // the element value
  elem* next;           // pointer to next list elem
public:
  elem() : val((T)0), next(0) {}   // default constr.
  elem(T v, elem* n);   // constructor
  ~elem();              // destructor
};

template <class T>   // definition tset
class tset
{ private: elem<T>* objects;   // element list
  public: tset();              // default constructor
          ~tset();             // destructor
          int in(T e);         // member test
          void add(T e);       // adds an element
          void printset(void); // output set
};

template <class T>  // print T objects
void print(T e)     // ordinary template function
{ cout << e; 
}

template <class T>      // constructor
elem<T>::elem(T v, elem<T>* n) 
: val(v), next(n)        
{}

template <class T>   // destructor
elem<T>::~elem() 
{ val = 0;
  next = 0;
}

template <class T>   // default constructor
tset<T>::tset() : objects(0) 
{ 
}

template <class T>   // destructor
tset<T>::~tset()
{ elem<T> *optr;
  while (objects)
    { optr = objects;
      objects = objects->next;
      delete optr;
    }
}

template <class T>   // check if e is in set
int tset<T>::in(T e)
{ elem<T> *optr = objects;
  while (optr)
  { if (optr->val == e)
     return 1;
    optr=optr->next;
  }
  return 0;
}

template <class T>   // add element to set
void tset<T>::add(T e)
{ if (!in(e))
  {  elem<T> *eptr = new elem<T>(e, objects);
     objects=eptr;
  }
}

template <class T>   // print all set elements
void tset<T>::printset(void)
{ elem<T> *optr = objects;
  while (optr)
  { print(optr->val);
    cout << endl;
    optr=optr->next;
  }
}

int main()               
{ tset<int> s;
  int i;
  while (cin >> i)   // read integers 
    s.add(i);        // add them to set
  s.printset();      // print set
  cout << endl;
}

next up previous contents index
Next: Klassen-Hierarchien und Vererbung Up: Schablonen Previous: Funktionsschablonen

Peter Pfahler, 1997