Luokkamallit (Templates)
Template on luokan malli, josta kääntäjä kääntää olion, joka on haluttua tyyppiä.
Siten esimerkiksi pinoa ei tarvitse tehdä erikseen kokonaisluvuille ja reaaliluvuille, kuten seuraava esimerkki osoittaa.
Malliluokan esittely
Templaten eli mallin esittely näyttää tavallisen luokan esittelyltä paitsi, että siinä on sana template. Seuraavassa on malli pinolle.
Code Block |
---|
template <class T>
class Stack
{
public:
Stack(int = 10) ;
~Stack() { delete [] stackPtr; }
int push(const T&);
int pop(T&) ;
int isEmpty()const { return top == -1; }
int isFull() const { return top == size - 1; }
private:
int size; // elementtien määrä pinossa
int top;
T* stackPtr;
};
//muodostin
template <class T>
Stack<T>::Stack(int s)
{
size = s > 0 && s < 1000 ? s : 10 ;
top = -1 ; // initialize stack
stackPtr = new T[size] ;
}
// uusi arvo pinoon
template <class T>
int Stack<T>::push(const T& item)
{
if (!isFull()) {
stackPtr[++top] = item ;
return 1; // pinon täytö ok
}
return 0; // ei mahdu enaa
}
// elementti pinosta
template <class T>
int Stack<T>::pop(T& popValue)
{
if (!isEmpty())
{
popValue = stackPtr[top--] ;
return 1 ; // ok
}
return 0 ; // ei onnistu, pino on tyhja
}
|
Esimerkki pinon käytöstä
Code Block |
---|
#include <iostream>
#include "stack.h"
using namespace std;
void main()
{
Stack <float> FloatStack ;
Stack <int> IntStack ;
FloatStack fs(5) ;
float f = 1.1 ;
cout << "laitetaan luku reaalilukupinoon fs" << endl ;
while (fs.push(f))
{
cout << f << ' ' ;
f += 1.1 ;
}
cout << endl << "Pino täynnä." << endl
<< endl << "Otetaan elementi pinosta" << endl ;
while (fs.pop(f))
cout << f << ' ' ;
cout << endl << "pino tyhjä" << endl ;
cout << endl ;
IntStack is ;
int i = 1.1 ;
cout << "laitetaan luku kokonaislukupinoon" << endl ;
while (is.push(i))
{
cout << i << ' ' ;
i += 1 ;
}
cout << endl << "pino täynnä" << endl
<< endl << "otetaan elementti pinosta" << endl ;
while (is.pop(i))
cout << i << ' ' ;
cout << endl << "pino tyhjä" << endl ;
}
|
Wiki Markup |
h1. Class Templates
h2. Implementing a class template
A class template definition looks like a regular class definition, except it is prefixed by the keyword template. For example, here is the definition of a class template for a Stack.template <class T>
class Stack
{
public:
Stack(int = 10) ;
~Stack() { delete [] stackPtr ; }
int push(const T&);
int pop(T&) ;
int isEmpty()const { return top == -1 ; }
int isFull() const { return top == size - 1 ; }
private:
int size ; // number of elements on Stack.
int top ;
T* stackPtr ;
} ; |