Showing posts with label template. Show all posts
Showing posts with label template. Show all posts

Wednesday, March 24, 2010

Membuat Class Berbentuk Template

Pada tulisan sebelumnya sudah dijelaskan bagaimana kita dapat membuat fungsi dalam bentuk template. Dengan konsep yang sama, kita juga dapat membuat class berbentuk template. Berikut ini adalah contoh sederhananya :

template<class T>
class KelasSaya
{
public:
T getNilaiTerkecil(T a, T b)
{
//implementasi dari getNilaiTerkecil
//silahkan lihat tulisan sebelumnya
}
void swap (T* a, T* b)
{
//implementasi fungsi swap
//silahkan lihat tulisan tentang fungsi swap
}
};

Cara memanggil kelas buatan kita diatas adalah sebagai berikut :

KelasSaya<int> objekKelasSaya;

cout<<objekKelasSaya.getNilaiTerkecil(1,4);

int a = 4;
int b = 3;
objekKelasSaya.swap(&a, &b);

Kita juga bisa menambahkan parameter tambahan pada kelas yang ditulis di dalam bentuk template. Alasan penambahan ini bisa bermacam-macam, misalnya saja kita ingin memberikan nilai pada sebuah konstanta yang terdapat didalam kelas tersebut. Berikut ini adalah contohnya: kita ingin menambahakan sebuah konstanta dengan nama NILAI_TERKECIL yang dipakai untuk memproteksi nilai terkecil yang bisa diberikan ke dalam kelas kita.

template<class T, int batasBawah>
class KelasSaya
{
public:
KelasSaya(): NILAI_TERKECIL(batasBawah)
{
//implementasi dari konstruktor
}
T getNilaiTerkecil(T a, T b)
{
//proteksi
if ( a<NILAI_TERKECIL || b<NILAI_TERKECIL)
{
cout << "KESALAHAN: Nilai untuk a & b harus lebih besar dari " <<
NILAI_TERKECIL << endl;
return 0;
}

//silahkan lihat tulisan sebelumnya
//implementasi dari getNilaiTerkecil
}
void swap (T* a, T* b)
{
//proteksi
if ( *a<NILAI_TERKECIL || *b<NILAI_TERKECIL)
{
cout << "KESALAHAN: Nilai untuk a & b harus lebih besar dari " <<
NILAI_TERKECIL << endl;
return;
}
//implementasi fungsi swap
//silahkan lihat tulisan tentang fungsi swap
}
private:
const T NILAI_TERKECIL;
};

Dari implementasi diatas dapat dilihat bahwa konstanta NILAI_TERKECIL dipakai untuk menentukan nilai terkecil dari parameter yang dikirimkan.

Perlu juga diperhatikan, teknik pemberian nilai pada konstanta. Tampak bahwa kita memberikan nilai pada konstanta disaat pemanggilan konstruktor - fungsi yang memiliki nama yang sama dengan nama kelas, dan ditulis seperti berikut:

KelasSaya(): NILAI_TERKECIL(batasBawah)

Berikut ini adalah contoh pemanggilan kelas kita:

KelasSaya<int,10> objekKelasSaya;
cout << objekKelasSaya.getNilaiTerkecil(12,1);

pada pemanggilan diatas, kita sudah membatasi nilai terkecil yang dapat diberikan kepada parameter dari semua fungsi yang berada didalam class KelasSaya, yaitu 10. Pada baris kedua, tampak bahwa kita memberikan nilai 1 ke parameter b dari fungsi getNilaiTerkecil(), dan nilai ini lebih kecil dari 10, sehingga secara otomatis pesan KESALAHAN akan ditampilkan.




Friday, March 19, 2010

Membuat Fungsi Berbentuk Template

Perhatikan contoh fungsi berikut :


int getNilaiTerkecil(int a, int b)
{
int hasil = b;
if (a<b)
{
hasil = a;
}
return hasil;
}

fungsi diatas digunakan untuk memilih nilai terkecil diantara dua nilai, a dan b. Jika a lebih kecil dari b maka nilai kembalian dari fungsi ini adalah a sebaliknya yang dikembalikan adalah nilai b.

Dari pendeklarasian fungsi tersebut, kita dapat melihat bahwa fungsi ini hanya bisa digunakan untuk tipe bilangan int, karena kedua parameternya, a & b, memiliki tipe int. Jika kita menggunakan tipe data yang lain, maka akan terjadi kesalahan kalkulasi.

int nilai_a = 5;
int nilai_b = 7;
int hasil = getNilaiTerkecil(nilai_a, nilai_b);
cout << hasil ; // akan tertampil 5

double nilai_a2 = 5.2;
double nilai_b2 = 7;
double hasil2 = getNilaiTerkecil(nilai_a2, nilai_b2);
cout << hasil2 ; // akan tertampil 5 <-- SALAH

salah satu teknik yang bisa kita pakai sebagai solusi dari masalah diatas adalah dengan membuat lagi sebuah fungsi baru dengan nama yang sama namun menggunakan parameter bertipe : double

double getNilaiTerkecil(double a, double b)
{
double hasil = b;
if (a<b)
{
hasil = a;
}
return hasil;
}

Kelemahan cara ini menurut saya, ukuran baris di dalam program kita menjadi lebih banyak. karena kita harus menuliskan ulang fungsi yang sama, namun yang diganti hanyalah bagian tipe data.

Untuk membuat program yang lebih ramping dan mampu menyelesaikan masalah diatas, kita bisa menggunakan template. Dengan menggunakan template, tipe data yang hendak dipakai bisa ditentukan oleh kita saat pemanggilan fungsi tersebut :

int nilai_a = 5;
int nilai_b = 7;
int hasil = getNilaiTerkecil<int>(nilai_a, nilai_b);
cout << hasil ; // akan tertampil 5

double nilai_a2 = 5.2;
double nilai_b2 = 7;
double hasil2 = getNilaiTerkecil<double>(nilai_a2, nilai_b2);
cout << hasil2 ; // akan tertampil 5.2 <-- BENAR

Berikut ini adalah bentuk fungsi getNilaiTerkecil(), jika dituliskan dalam bentuk template :

template <typename TIPEDATA>
TIPEDATA getNilaiTerkecil(TIPEDATA a, TIPEDATA b)
{
TIPEDATA hasil = b;
if (a<b)
{
hasil = a;
}
return hasil;
}

kata 'typename' bisa juga diganti dengan 'class'. Tidak ada beda, apakah kita menggunakan 'typename' atau menggunakan 'class'. Namun umumnya jika TIPEDATA yang akan dipakai adalah berupa class, maka yang digunakan adalah 'class' bukan 'typename'.