Šablony
Pro většinu šablon je potřebné, aby se daly třídy pro instanci kopírovat a měly bezparametrický konstruktor. Je vhodné minimalizovat závislost na externích jménech a operacích. Takovou operací může být například výpis pomocí operátorů <<, který je definován jen pro omezenou množinu datových typů. Máme-li v šabloně takovýto operátor, snižujeme počet možnosti využití šablony. Pro eliminaci problému je pak potřeba předefinovat potřebné operace pro další datové typy.
Příklad č.1
Následující kód ukazuje jednoduchou šablonu pro zásobník, který k uložení prvků využívá dynamicky vytvořené pole. Šablona nelze využít pro datové typy, které nemají definován přiřazovací operátor =.
#include <iostream.h>
template <typename typ>class Zasobnik
{
private:
typ *p;
int vrchol;
int max;
static typ chyba; //implicitní hodnota
public:
Zasobnik(int); //konstruktor
~Zasobnik(); //destruktor
void PridejNaVrchol(typ);
typ OdeberZVrcholu();
bool JePrazdny();
};
template <typename typ> Zasobnik <typ>::Zasobnik(int
pocet)
{
p=new typ[pocet];//vhodné ošetřit, zda se alokovala
paměť!
max=pocet;
vrchol=-1;//pole zacina od O
}
template <class typ> Zasobnik <typ>::~Zasobnik()
{
delete []p;
}
template <class typ> void Zasobnik
<typ>::PridejNaVrchol(typ x)
{
if (vrchol<max-1)
{
vrchol++;
p[vrchol]=x;
}
else
cout << "Chyba! Zasobnik je plny! Nelze
pridavat!"<<endl;
}
template <class typ> typ Zasobnik
<typ>::OdeberZVrcholu()
{
if (vrchol>=0)
{
return p[vrchol--];
}
else
{
cout<<"Chyba! Zasobnik je prazdny! Nelze
odebirat!"<<endl;
return chyba;
}
}
template <class typ> bool Zasobnik <typ>::JePrazdny()
{
return (vrchol<0)? true : false;
}
int Zasobnik<int>::chyba=-1;
double Zasobnik<double>::chyba=-1.0;
char Zasobnik<char>::chyba=' ';
int main(int argc, char *argv[])
{
//zásobník pro typ int
Zasobnik<int> s1(10);
//vytvoří se zásobník maximálně pro 10 prvků
//přidání desítí prvků do zásobníků
for(int i=10;i<20;i++) s1.PridejNaVrchol(i);
//vybírání prvků
cout<<"Prvky v zasobniku:"<<endl;
while (s1.JePrazdny()!=true)
cout<< s1.OdeberZVrcholu()<<endl;
//zásobník pro typ double
Zasobnik<double> s2(10);
//vytvoří se zásobník maximálně pro 10 prvků
//přidání prvků do zásobníků
s2.PridejNaVrchol(1000.11);
s2.PridejNaVrchol(1456.78);
s2.PridejNaVrchol(3456.67);
s2.PridejNaVrchol(4321.43);
s2.PridejNaVrchol(9876.54);
//vybírání prvků
cout<<"Prvky v zasobniku:"<<endl;
while (s2.JePrazdny()!=true)
cout<< s2.OdeberZVrcholu()<<endl;
//zásobník pro typ char
Zasobnik<char> s3(10);
//vytvoří se zásobník maximálně pro 10 prvků
//přidání prvků do zásobníků
s3.PridejNaVrchol('a');
s3.PridejNaVrchol('b');
s3.PridejNaVrchol('c');
s3.PridejNaVrchol('d');
//vybírání prvků
cout<<"Prvky v zasobniku:"<<endl;
while (s3.JePrazdny()!=true)
cout<< s3.OdeberZVrcholu()<<endl;
return 0;
}
Autor: Filip Koval