10.2. Generická třída

Časová náročnost
Časová náročnost: 8 minut

Generická třída vychází ze stejného principu jako generická funkce. Pokud tedy nadefinujeme nějakou třídu jako generickou, definujeme tím všechny algoritmy touto třídou použité, ale konkrétní typ obsluhovaných dat, bude specifikován až jako argument při vytváření objektu třídy.

Generické třídy jsou použitelné tehdy, pokud chceme nadefinovat zevšeobecnitelnou logiku.

Syntaxe je následující:

upozornění
template <class Typ> class jméno-třídy
{
 // tělo třídy
}


Typ je typové jméno vlastníka prostoru, které bude specifikováno, když bude třída konkretizována. Můžeme také v čárkami odděleném seznamu definovat více generických typů.

Pomocí následujícího formátu poté vytváříme specifické případy dané třídy:
jméno-třídy <typ> ob;


Typ je tentokrát jméno typu dat, se kterým bude třída pracovat.

upozornění Členské funkce generické třídy jsou automaticky generické. Nemusí být proto uvozeny klíčovým slovem template.

Následující program vytvoří generickou třídu pro spojový seznam. Poté tuto třídu použije pro ukládání znaků.

src/10_2.cpp
Příklad 10.2.
#include <iostream.h>

template <class data_t> class list {
  data_t data;
  list *next;
public:
  list(data_t d);
  void add(list *node) {node->next = this; next = 0; }
  list *getnext() { return next; }
  data_t getdata() { return data; }
};

template <class data_t> list<data_t>::list(data_t d)
{
  data = d;
  next = 0;
}

int main()
{
  list<char> start('a'); 
  list<char> *p, *last;
  int i;
  
  // vytvareni seznamu znaku
  last = &start;
  for(i=1; i<26; i++) {
    p = new list<char> ('a' + i);
    p->add(last);
    last = p;
  }

  // vypis seznamu
  p = &start;
  while(p) {
    cout << p->getdata();
    p = p->getnext();
  }

  return 0;
}