Selain pada
fungsi, konsep template dapat diterapkan juga pada kelas. Misalnya dengan menggunakan
contoh Stack yang sudah diberikan dan dengan fasilitas
template ini, perancang kelas dapat dengan mudah menciptakan Stack of integer,
Stack of double, Stack of character, Stack of Complex, Stack of Process, Stack
of String, dsb.
Fasilitas template C++ memberikan kemungkinan untuk membangkitkan
kelas-kelas di atas melalui instansiasi dari kelas generik. Untuk menciptakan
kelas generik, perancang kelas harus dapat mengidenti_kasi parameter-parameter
mana yang menentukan sifat kelas. Dalam contoh Stack yang diberikan
parameter yang menentukan kelas adalah jenis int yang berkaitan
dengan data yang disimpan di dalam Stack. Deklarasi kelas Stack yang ditunjukkan pada Contoh 3.2 dapat diubah menjadi deklarasi kelas Stack generik seperti pada Contoh di bawah ini
Contoh Deklarasi
kelas Stack generik
template
<class Type>
class
Stack {
public:
//
ctor-cctor-dtor
Stack();
// default ctor
Stack
(int); // ctor dengan ukuran max stack
Stack
(const Stack&); // cctor
~Stack();
//
services
void
Push (Type); // <=== parameter generik
void
Pop (Type&); // <=== parameter generik
int
isEmpty() const;
int
isFull() const;
//
operator
Stack&
operator= (const Stack&);
void
operator<< (Type); // <=== parameter generik
void
operator>> (Type&); // <=== parameter generik
private:
const
int defaultStackSize = 500; // ANSI: tidak boleh inisialisasi
int
topStack;
int
size;
Type
*data; // <=== parameter generik
};
Untuk
menciptakan objek dari kelas generik, pemrogram menuliskan deklarasi objek dengan
sintaks:
kls-generik < tipe-instansiasi > objek ;
Stack<int> a; // Stack of integer
Stack<double> b (30); // Stack of
double, kapasitas maks = 30
Stack<Complex> c; // Stack of Complex
CATATAN:
·
nama Stack<int>, Stack<double>,
... dapat dipandang sebagai nama tipe baru!
·
Definisi
fungsi anggota harus dituliskan sebagai fungsi template dan scope yang semula dituliskan sebagai Stack:: harus
dituliskan sebagai Stack<Type>::. Hal ini harus dilakukan untuk seluruh
fungsi anggota kelas tersebut. Sebagai contoh, konstruktor dan fungsi anggota Push() dituliskan sebagai fungsi template
berikut ini:
template <class Type>
Stack<Type>::Stack ()
{
size = defaultStackSize;
topStack = 0;
data = new TYPE [size];
}
template <class Type>
void Stack<Type>::Push
(Type item)
{
// ...
if (!isFull()) {
data [topStack] = item;
topStack++;
}
// ...
}
Sebelumnya
dijelaskan bahwa dalam penulisan kelas ke dalam file, bagian deklarasi kelas
dituliskan ke file X.h dan bagian definisi fungsi-fungsi anggota
dituliskan ke file X.cc. Jika kelas generik digunakan untuk
mendeklarasikan kelas, maka baik deklarasi kelas generik maupun de_nisi
fungsi generik dituliskan ke dalam file
X.h. Sehingga untuk contoh Stack di atas, keduanya dituliskan di dalam file Stack.h.
·
Di luar
konteks de_nisi kelas generik, nama tipe yang dapat digunakan (misalnya oleh
fungsi, deklarasi variabel/objek, dsb.) adalah nama tipe hasil instansiasi.
Dalam contoh di atas tipe hasil instansiasi adalah Stack<int>, Stack<double>,
and Stack<Complex>.
Hal ini juga berlaku pada fungsi anggota kelas. Jika misalkan ada fungsi
anggota kelas generik Stack::Reverse()
yang memerlukan objek lokal
bertipe Stack yang generic maka deklarasinya adalah:
template <class Type>
void
Stack<Type>::Reverse() {
Stack<Type> stemp; //
objek lokal yang generik
// ...algoritma dari
Reverse()...
}
Untuk efisiensi
pemanfaatan kelas generik, sebaiknya digunakan member initialization list
di dalam
constructor maupun copy constructor.
|