• Tidak ada hasil yang ditemukan

Run-Time Type Identification (RTTI)

Dalam dokumen BAB 14 OPERATOR OVERLOADING (Halaman 31-36)

TYPECASTING DAN RTTI

17.6 Run-Time Type Identification (RTTI)

Bagi Anda yang sebelumnya terbiasa memogram dengan bahasa non-polymorphic, seperti bahasa C, mungkin istilah RTTI ini adalah rstilah baru bagi Anda. Dalam bahasa C, tipe data dari setiap objek hanya dikenali pada saat kompilasi saja. Namun pada bahasa polymorphic, seperti bahasa C+ + , kita dapat mengenali tipe data dari suatu objek pada saat program dieksekusi (run-time). Dalam C + + , untuk melakukan hal ini kita harus menggunakan kata kunci typeid, dimana sebelumnya kita juga harus mendaftarkan file header <typeinfo>. Member dari typeid yang digunakan untuk Pemrograman C++

mendapatkan nama tipe adalah name. Adapun bentuk umum dari penggunaan typeid ini adalah seperti yang tampak di bawah ini.

typeid (nama_objek)/ ^flHHHR : ; ; :' flHHHMH@Hl

nama_objek yang dimaksud di atas adalah semua objek yang terdapat dalam C+ + , bisa berupa variabel maupun instance dari suatu kelas. Adapun tipe yang didapatkan juga dapat berupa tipe dasar, tipe bentukan ataupun tipe kelas. Berikut ini contoh program yang mendemonstrasikan prinsip di atas.

Kode Program 17-8

linclude <iostream>

#include <typeinfo>

using namespace std;

// Mendefinisikan kelas MANUSIA sebagai kelas dasar atau indi class MANUSIA {

public:

virtual void BerjalanO { }; // bersifat polymorphic

// Mendefinisikan kelas MAHASISWA sebagai turunan dari kelas // MANUSIA

class MAHASISWA: public MANUSIA { public:

void BerjalanO {

cout«"Mahasiswa berjalan dengan cara SANTAl"«endl;

// Mendefinisikan kelas TENTARA sebagai turunan // dari kelas MANUSIA

class TENTARA: public MANUSIA { public:

void BerjalanO {

cout«"Tentara berjalan dengan cara TEGAP"«

// Fungsi utama int main() {

.// Mendeklarasikan variabel dengan tipe dasar int X;

float Y;

char C;

"•^^^^^^^^^^^^^^M^^^^^^^^^^^^^^^^M^M^^^^^^^^^^^^^B^^^^^^^^^MiVmm^^^^M^^^^M

Bab 17: Typecasting dan RTTI

// Mendeklarasikan objek yang bertipe ke TENTARA T;

:MAHASISWA M;

// Mendapatkan tipe masing-masing objek pada saat run-tj cout«"Tipe dari: variabel X adalah : w«typeid(X) .namef) cout«endl ;

:Cout«"Tipe dari variabel Y adalah : "«typeid(Y) .nameO ;

cout«endl;

Tipe dari variabel C adalah : "«typeid(O .name mt«"Tipe dari variabel str adalah : tt«typeid(str) .name(

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

Tipe dari variabel X adalah : int Tipe dari variabel Y adalah : float Tipe dari variabel C adalah : char Tipe dari variabel str adalah : char *

T merupakan objek yang bertipe : TENTARA M merupakan objek yang bertipe : MAHASISWA

17.6.1 typeid pada Pointer

Untuk mendapatkan tipe data dari objek yang ditunjuk oleh sebuah pointer, kita dapat menggunakan typeid pada pointer tersebut.

Berikut ini contoh program yang membuktikan hal tersebut.

ttinclude <iostream>

tinclude <typeinfo>

Pemrograman CH

// Mendefinisikan kelas MANUSIA setjjjjfri kelas dasar atau induk class MANUSIA {

publi c:

virtual void B e r j a l a n O { }; // bersifat polymorphic // . . .

// Mendefinisikan kelas MAHASISWA sebagai turunan dari kelas // MANUSIA

Class MAHASISWA: public MANUSIA { public:

void BerjalanO {

cout«"Mahasiswa berjalan dengan cara SANTAI"«endl •

// Mendefinisikan kelas TENTARA sebagai turunan // dari kelas MANUSIA

class TENTARA: public MANUSIA { public :

void BerjalanO {

cout«"Tentara berjalan dengan cara TEGAP"«endl;

} ;

// Fungsi utama int main() {

// Mendeklarasikan pointer ke tipe MANUSIA MANUSIA *P;

MANUSIA MNS;

TENTARA T;

MAHASISWA M;

// Pointer P menunjuk ke alamat dari objek MNS P = &MNS;

cout«"MNS merupakan objek yang bertipe :<typeid(*P).name();

cout«endl;

// Pointer P menunjuk ke alamat dari objek T P = &T;

cout«"T merupakan objek yang bertipe : "«typeid (*P) .name cout«endl ;

// Pointer P menunjuk ke alamat dari objek M P = &M;

cout«"M merupakan objek yang bertipe : "«typeid(*P) .name I cout«endl;

Bab 17: Typecasting dan RTTI

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

MNS merupakan objek yang bertipe : MANUSIA T merupakan objek yang bertipe : TENTARA M merupakan objek yang bertipe : MAHASISWA

Namun, perlu sekali diperhatikan bahwa pointer di atas berlaku untuk kelas yang bersifat polymorphic, sedangkan jika tidak (non-polymorphic) maka tipe yang akan didapatkan selalu tipe dari kelas induknya. Berikut ini contoh program yang memperlihatkan konsep tersebut.

Kode Program 17-10

using namespace std;

// Mendefinisikan kelas MANUSIA sebagai kelas dasar atau ii Lass MANUSIA {

xLic:

;;oid Berjalan() { }; // bersifat non-polymorphic // karena bukan virtual

Mendefinisikan kelas MAHASISWA sebagai turunan dari kelas MANUSIA

class MAHASISWA: public MANUSIA {

(

void BerjalanO {

cout«"Mahasiswa berjalan dengan cara SANTAl"«endl

IB

// Mendefinisikan kelas TENTARA sebagai turunan // dari kelas MANUSIA

class TENTARA: public MANUSIA { public:

>id Berjalan ( ) {

cout«"Tentara berjalan dengan cara TEGAP"«endl;

Pemrograman C++

'•/ Fungsi utam-nt m a i n ( ) {

// Mendeklarasikan pointer ke tipe MANUSIA MANUSIA *P;

MANUSIA MNS;

TENTARA T;

MAHASISWA M;

// Pointer P menunjuk ke alamat dari objek MNS P = &MNS; I cout«"MNS merupakan objek yang bertip?

«typeid( *P) .name ( ) ; cout«endl ;

// Pointer P menunjuk ke alamat dari objek T P = &T;

cout«"T merupakan objek yang bertipe : "«typeid(*P) .name();

cout«endl ;

// Pointer P menunjuk ke alamat dari objek M P = &M;

cout«"M merupakan objek yang bertipe : "«typeid(*P) .name () ; cout«endl;

return 0;

Sekarang, hasil yang akan diberikan dari program di atas adalah sebagai berikut:

MNS merupakan objek yang bertipe : MANUSIA T merupakan objek yang bertipe : MANUSIA M merupakan objek yang bertipe : MANUSIA

17.6.2 typeid pada Reference

Selain pada pointer, typeid juga dapat digunakan pada tipe reference. Berikut ini contoh program yang membuktikan pernyataan tersebut dimana terdapat sebuah fungsi yang dilewatkan berdasarkan re/erence-nya.

Bab 17: Typecasting dan RTTI

Kode Program 17-11

#include <iostream>

ftinclu.de <typeinfo>

using namespace std;

•lendefinisikan kelas MANUSIA sebagai kelas dasar atau induk class MANUSIA {

public: . virtual void BerjalanO { }; // bersifat polymorphic

Mendefinisikan kelas TENTARA sebagai turunan dari kelas Lass TENTARA: public MANUSIA {

' Mendefinisikan fungsi dengan parameter bertipe referei ' tipe MANUSIA

>id CariTipe(MANUSIA& Ob) {

cout«"0b sedang mengacu ke objek yang bertipe : ";

cout«typeid{0b) .nameO ; cout«endl;

Pemrograman C++

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

Ob sedang mengacu ke objek yang bertipe : MANUSIA Ob sedang mengacu ke objek yang bertipe : TENTARA Ob sedang mengacu ke objek yang bertipe : MAHASISWA

17.6.3 typeid pada Template

Setelah mempelajari RTTI yang terdapat pada objek pointer dan reference, kini saatnya kita membahas typeid yang digunakan untuk sebuah template kelas. Pembahasan ini mungkin dapat dikatakan cukup berat, karena sejauh ini kita memang belum membahas mengenai template. Namun, Anda tidak perlu khawatir karena di dalam buku ini kita akan membahasnya lebih detil di bagian tersendiri, yaitu bab mengenai template.

Untuk lebih mengetahui tentang typeid yang terdapat pada sebuah template kelas, perhatikan contoh program di bawah ini.

Kode Program 17-12 tinclude <iostream>

#include <typeinfo>

using namespace std;

// Membuat template kelas

template <class T> class CONTOH { T X;

public:

' CONTOH(T XX) { X = XX;

int main() {

// Melakukan instansiasi CONTOH<int> 01(10), 02(20);

CONTOH<double> 03(3.25);

CONTOH<char> 04('C'};

// Mendapatkan tipe dari 01 cout«"Tipe dari objek 01 adalah cout«typeid(01) .nameO;

cout«endl ;

Bab 17: Typecasting dan RTTI

i

Mendapatkan tipe dari O2 out«"Tipe dari objek 02 adalah cout«typeid(02) .name() ;

cout«endl ;

// Mendapatkan tipe dari 03

cout«"Tipe dari objek 03 adalah : "?

cout«typeid(03) .name{) ; cout«endl ;

// Mendapatkan tipe dari 04

cout«"Tipe dari objek 04 adalah : "?

:cout«typeid (04) .name () ; cout«endl ;

return 0;

Hasil yang akan diberikan dari program di atas adalah sebagai berikut:

Tipe dari objek Ol adalah : CONTOH<int>

Tipe dari objek O2 adalah : CONTOH<int>

Tipe dari objek O3 adalah : CONTOH<double>

Tipe dari objek O4 adalah : CONTOH<char>

Pemrograman C++

BAB 18 TEMPLATE

18.1 Pendahuluan

Salah satu fitur C + + yang tidak dimiliki oleh kebanyakan bahasa pemrograman lainnya adalah template. Fitur ini dibuat beberapa tahun yang lalu dan telah didukung oleh semua kompiler C+ + modern (standar). Dengan menggunakan template, kita dapat membuat fungsi-fungsi atau kelas-kelas generik. Artinya, sekali kita membuat fungsi atau kelas tersebut, maka kita dapat menggunakannya untuk berbagai tipe data tanpa harus mengulang penulisan kode dari fungsi atau kelas tersebut. Dalam C + + , template dibuat dengan menggunakan kata kunci template.

Template merupakan ide dasar dari pembentukan STL (Standard Template Library) yang digunakan untuk memudahkan dan mempercepat pembuatan program dengan menggunakan C + + . Pembahasan mengenai STL merupakan pembahasan yang sangat kompleks, untuk itu di dalam buku ini kita tidak akan mengkajinya.

Meskipun demikian, dengan berbekal konsep yang akan dibahas dalam bab ini, diharapkan Anda tidak akan mengalami kesulitan yang berarti apabila Anda ingin mulai mempelajari STL dari liter atur lain.

Bab 18: Template

Pada bagian ini kita akan membahas mengenai template secara lebih detil. Adapun dalam buku ini, pembahasan tersebut akan dibagi ke dalam dua bagian, yaitu template fungsi dan template kelas.

Dalam dokumen BAB 14 OPERATOR OVERLOADING (Halaman 31-36)

Dokumen terkait