Professional Documents
Culture Documents
// template<class T>
// Stack<T>::Stack<T>(int r) // to jest błąd,
// // powinno być:
// // Stack<T>:: Stack(int,r)
//{
// v = p = new T[size=r];
//};
Rozbudowywanie klas-wzorców
• Wzorca który jest już napisany i wykorzystywany nie
należy modyfikować — modyfikacje te będą
dotyczyły wszystkich klas stworzonych w oparciu o
ten wzorzec.
– Gdy dodamy zmienne klasowe to powiększą się obiekty
wszystkich tych klas wywiedzionych ze wzorca.
– Gdy zmienimy definicje metod to zmiany będą dotyczyły
wsystkich klas wywiedzionych ze wzorca.
template<class T>
class Filed_Stack : public Stack<T>
{
char * file_name;
public:
void save_Stack();
void load_Stack();
};
Wzorzec szczegółowy
• Jeżeli wzorzec działa niepoprawnie dla jakiegoś szczególnego
parametru, to można zdefiniować inną wersję wzorca dla
konkretnego parametru. Np. klasa która służy do porównywania
elementów danego typu:
template<class T>
class comparator // wzorzec ogólny
{
public:
static int less(T &a, T &b)
{
return a<b;
}
};
• Powyższe jest poprawne dla typów takich, jak int czy char. Dla łańcuchów (char *)
porównywane by były nie łańcuchy, ale ich adresy,
Wzorzec szczegółowy
• Dla łańcuchów (char *) porównywane by były nie łańcuchy,
ale ich adresy, więc definiujemy szczególną postać wzorca
klasy porównywacz dla łańcuchów:
class comparator<char *> //wzorzec szczegółowy
{
public:
static int less(const char * a, const char * b)
{
return strcmp(a, b)<0;
}
};
int a = 7, b = 8;
exchange(a, b); // kompilator rozwinie wzorzec
// (jeżeli jest widoczny)
Wzorce funkcji - przykład
• napisać rodzinę funkcji zwiększających wartość swojego pierwszego
argumentu aktualnego o wartość drugiego argumentu (oba to typy
liczbowe)
template <class t>
void increm(t &i, double d)// zadzaiala dla wszystkich typów
// liczbowych
{ // ale jak ktos wywola zwieksz(1, 1)
i += t(d); // to będą 2 automatyczne konwersje
}; // nieekologiczne - marnotrawstwo czasu
template<class T>
using Vec = std::vector<T, My_alloc<T>>;
// standard vector using my allocator
Vec<int> fib = { 1, 2, 3, 5, 8, 13 };
// allocates elements using My_alloc
– std::sort(indices.begin(), indices.end(),
[&](int a, int b) { return v[a].name<v[b].name; });
-funkcje lambda, omówimy je razem z algorytmami STL