20 Januari, 2010

Kelas Generik


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.




1 komentar:

Gombong Online mengatakan...

thanks sharring ilmunya..

Posting Komentar