Showing posts with label C plus plus. Show all posts
Showing posts with label C plus plus. Show all posts

Monday, 3 March 2014

C++ No.17: Membuat Hello World dengan class dan header


Software yang kita gunakan: Microsoft Visual Studio 2013 Update 1 , bila anda menggunakan compiler/IDE lain sebetulnya adalah sama saja.

Pada tutorial – tutorial sebelumnya, kita sudah banyak membahas tentang C++, ada yang pernah bertanya, bagaimana caranya membuat sebuah aplikasi dengan header (.h)? contohnya seperti kita memiliki minimal 3 file , main.cpp, metu.h, dan metu.cpp .
Untuk anda yang sering membaca tutorial maupun sering browing code, pasti selalu menemui hal – hal seperti ini, banyak para programmer yang menggunakan “namafilesendiri.h” digabungkan dengan “namafilesendiri.cpp” digabungkan lagi dengan “main.cpp” dari pada membuat satu buah “file.cpp” jumbo.

Hayo, masihkah anda ingat dengan perbedaan dari line berikut ini?
#include “namafilesendiri.h”
#include <namafilesendiri.h>
Nah, bila lupa, silahkan baca tutorial ini :)





#include “namafilesendiri.h” , maka compiler akan mencari terlebih dahulu file tersebut pada directory project kita, bila tidak ditemukan baru mencari file tersebut di directory standard C++,

#include <namafilesendiri.h>, maka compiler akan langsung mencari file tersebut pada standard directory C++,
OK, mari kita kembali ke topik, bagaimana cara membuat Hello World application dengan header seperti yang di gambarkan di awal tadi?

Sebetulnya gampang saja, sebagai pemula, biasanya kita membuat sebuah applikasi dengan class seperti berikut ini:
Lihat gambar 1:


Nah, anda bisa lihat, kita membuat declaration, kemudian definition, kemudian baru terakhir adalah main() method nya.
Declaration adalah kita mendeclarasikan class nya atau method nya. Perhatikan gambar, di dalam deklarasi class HelloWorld, kita mengdeklarasikan juga method “sayHello();”. Ini baru deklarasi, belum definisi :) , anda bisa lihat sayHello(); belum terdefinisikan di class HelloWorld, benar bukan?

Kemudian untuk code berikutnya, kita mendefinisikan method sayHello(); ini dengan operator dua colons ( :: ). Operator ini digunakan untuk mendefinisikan method di luar class. Biasanya kan method langsung didefinisikan di dalam class, nah, dengan menggunakan operator dua colons ( :: ) kita bisa mendefinisikan nya di luar class.

Nah, bagaimana kalo kita pisah – pisah kodenya, biar lebih rapi, seperti pada screenshot berikut ini,
Lihat gambar 2:


Nah, kita bagi single file di atas menjadi metu.h, metu.cpp, dan main.cpp. Metu.h berisikan declarasi dari class dan method, metu.cpp berisikan definisi dari class dan method pada metu.h, kemudian main.cpp berisikan main method untuk project C++ kita.
Sampai di sini gampang dimengerti kan??

Lalu, apakah hanya begitu saja? Tidak, kita harus mengkonekan antar file tersebut agar ada kesinambungan dengan directives #include.

Berikut merupakan kode nya:
metu.h


metu.cpp


main.cpp


Nah, lihat gambar screenshot di atas, mudah bukan,, kita hanya perlu berfikir sebentar, memahami dan menuliskan kodenya,,

Lihat, kita saling meng-include kan file agar file – file tersebut berhubungan satu dengan yang lainnya.

Ok, sekian tutorial singkat membuat simple app dengan class dan header, semoga bermanfaat.

Salam,

Friday, 14 February 2014

C++ No.16: Mengenal Preprocessor Directive


Pernahkah anda mendengar preprocessor?? Processor itu artinya pemroses, sedang pre artinya sebelum. Jadi preprocessor adalah PROSES AWAL sebelum mengeksekusi kode program kita :P

Nah, apakah yang di proses oleh prosessor pada “PROSES AWAL” sebelum processor ini memproses kode kita line per line?
Yup, processor akan melakukan ekspedisi apakah ada perintah awal sebelum memulai eksekusi kode kita. Perintah – perintah awal ini dinamakan dengan “PREPROCESSOR DIRECTIVES”.

Kesimpulannya:
Preprocessor directive merupakan sebuah baris kode perintah untuk preprocessor. Baris kode ini bukan merupakan kode statement, tetapi baris perintah untuk preprocessor sebelum mengeksekusi kode program.


Perintah ini (Directives) selalu diawali dengan tanda hash (#) dan hanya satu line saja. Boleh memakai “ ; “ boleh tidak. Untuk pengguna Visual Studio bisa menggunakan “ ; “ bisa tidak, tapi mungkin pengguna Compiler lain tidak diizinkan menggunakan “ ; “. Perintah baris dengan tanda # inilah yang akan dikerjakan terlebih dahulu sebelum memroses/mengeksekusi kode kita.
Sebetulnya preprocessor directive ini bisa kok lebih dari satu line asalkan ditambahkan backslash di bagian akhir line ( \ ).

Banyak sekali jenis – jenis dari PREPROCESSOR DIRECTIVES ini, diantaranya adalah sebagai berikut:
A.Macro Definitions
Untuk pendefinisian preprocessor macro, kita dapat menggunakan :
#define [identifiernya] [penggantinya]
#undef [identifiernya]

Contoh:
#define TABLE_SIZE 100
#define JUMLAH 35


Nah, pada contoh di atas, identifier adalah TABLE_SIZE, pengganti adalah 100. Begitu juga dengan contoh kedua.

[penggantinya] ini bisa berupa apa aja, bisa berupa expression, bisa berupa statement, block, dan lain – lain, apa saja.

Preprocessor ini tidak menghiraukan bahkan tidak memahami C++ , sehingga apapun yang digunakan sebagai [penggantinya] akan dilakukan.

Lihat gambar 1:


Pada contoh anda bisa lihat, apapun yang saya lakukan terhadap TABLE_SIZE, maka hasilnya adalah 100, karena saya telah mendefinisikan bahwa TABLE_SIZE adalah 100.

Mudah bukan??? Nah, sekarang mari kita hapus definisi terhadap TABLE_SIZE ini, caranya adalah dengan menggunakan #undef.

#undef digunakan untuk menghapus definisi untuk [identifier].

#undef TABLE_SIZE

Lihat gambar 2:


Pada kode di atas, kita menghilangkan definisi terhadap TABLE_SIZE, kemudian mendefinisikan kembali dengan [pengganti] berbeda.
Mudah dipahami bukan??

Nah, tadi di awal, kita mengatakan bahwa [penggantinya] ini bisa berupa apa aja. Bisakah berupa seperti function? Bisa, contohnya:

#define getMax(a,b) (a>b?a:b)

Kita mendefinisikan, apapun kode yang terdapat dalam kodeline kita, bila kode tersebut berupa getMax(a,b) maka akan digantikan dengan (a>b?a:b).

Sebentar dulu, bisakah anda membaca (a>b?a:b) ??

Bacanya adalah “bila a lebih besar dari b, maka return nilai a, yang lain return nilai b”.

Lihat gambar 3:


Hasilnya adalah 5.

Nah, pada kode di atas, semua kode yang mengandung getMax() akan digantikan oleh [penggantinya].

Macro definition ini memiliki dua operator khusus yaitu hash (#) dan double hash (##).
Bila # digunakan di depan [penggantinya] maka akan di convert menjadi string.
Lihat contoh:

#define embuh(x) #x
cout << embuh(hem);


Maka, akan menghasilkan:
cout << “hem”;

Sementara itu, operator ## digunakan untuk menggabungkan dua argument, contoh:
#define gabung(a,b) a ## b
gabung(c,out) << ”test”;


akan menghasilkan:
cout << ”test”;

Mudah bukan??


B.Conditional Inclusion
Namanya juga conditional, pasti berhubungan dengan if else :)
Directives yang digunakan untuk conditional diantaranya adalah sebagai berikut:
#ifdef , #ifndef , #if !define , #if , #endif , #else , #elif

Coba perhatikan contoh kode ini:
#ifdef TABLE_SIZE
a = TABLE_SIZE;
#endif


Artinya bila TABLE_SIZE telah didefinisikan, maka nilai a adalah TABLE_SIZE. Mudah kan?

Kode di atas, sama dengan kode berikut ini:
#if !define TABLE_SIZE
a = TABLE_SIZE;
#endif


Nah, bagaimana kalo kita lengkapi kodenya jadi seperti ini:
#ifdef TABLE_SIZE
a = TABLE_SIZE;

#else
a = 10;
#endif


nah, kalo kode ini ada elsenya, yaitu bila TABLE_SIZE didefinisikan, maka nilai a adalah TABLE_SIZE, bila belum didefinisikan maka nilai a adalah 10.

Kita akan mencoba lagi:
#ifdef TABLE_SIZE
a = TABLE_SIZE;

#elif TABLE_SIZE > 200;
a = 10;

#else
a = TABLE_SIZE
#endif


Mudah bukan membacanya?
Bila TABLE_SIZE telah didefinisikan, maka nilai a adalah TABLE_SIZE, bila nilai TABLE_SIZE lebih besar dari 200 maka nilai a diberikan 10 saja, yang lain maka nilai a sama dengan TABLE_SIZE.


C.Line Control
Digunakan untuk men-display line number dari kode kita. Sintaks nya adalah:
#line [number] [filename]
Contoh:
#line 20 “ini cuman contoh”
Int a?; //ini iseng doang


Coba debug, pasti ada konfirmasi ERROR::“line 20, ini cuman contoh”. :)
Sangat cocok sekali buat anda yang mungkin ingin men-track kode anda.


D.Error Directive
Digunakan untuk meng-alert / men-display alert sesuai dengan yang kita inginkan.
Sintaks:
#error [message]

contoh:
#ifndef TABLE_SIZE
#error Wah, bro, TABLE_SIZE belum didefinisikan nuh, coba check lagi
#endif


E.Source File Inclusion
Kalo yang ini sering sekali kita gunakan. Sintaksnya adalah sebagai berikut:
#include
#include “namafile”


Perbedaan pada keduanya adalah tempat / directori / folder dimana compiler akan mencari [namafile].

Untuk penggunaan di antara angle-bracket ( <> ), maka compiler akan mencari [namafile] langsung pada directory default C++ standard header file.

Sedangkan untuk penggunaan di antara quote ( “ ” ), maka compiler akan mencari [namafile] pada directory yang sama dengan file .cpp yang ada directives nya, bila tidak ditemukan, baru akan mencari ke standar directory default header file.

F.Pragma Directive
Setiap compiler memiliki opsi / fasilitas tersendiri yang berbeda dengan lainnya. Opsi khusus ini bisa didefinisikan melalui pragma.
Coba check saja compiler anda, kira kira apa saja yang dapat didefinisikan dalam pragma ini.

G.Predefined Macro
Selain dengan define ( # ) , ternyata ada juga yang predefined. Nah, predifined macro ini dapat didefinisikan kapan saja.
Berikut merupakan predefined macro:
a.__LINE__ : Berupa integer dari nilai baris kode yang sedang dicompile.
b.__FILE__ : Merupakan nama file kode yang sedang dicompile.
c.__DATE__ : Berisikan tanggal (Mmm dd yyyy) saat file yang bersangkutan dicompile.
d.__TIME__ : Berisikan waktu (hh:mm:ss) saat file yang bersangkutan dicompile.
e.__cplusplus : Berupa integer value. Semua C++ compiler memiliki nilai konstan sendiri – sendiri untuk predefine ini.

Lihat gambar 4:


Hasil dari kode di atas adalah seperti berikut ini,
Lihat gambar 5:


Di atas merupakan contoh penerapan predefined macro.
Akhirnya sekian tutorial dari MediaTutorial kali ini, semoga bermanfaat.
Salam.

Monday, 10 February 2014

C++ No.15: Mengenal Type Conversion dan Casting pada C++


Pernahkah anda mendengar type conversion?? Pernahkah anda mendengar casting?? Untuk anda yang berkecipung di dunia pemrograman C++ pasti sering mendengar dan melakukan konversi – konversi seperti ini. Dan untuk yang berkecipung di bahasa lain, sebetulnya anda setiap membuat program juga pasti melakukan istilah ini. :)

Apa itu type conversion?? Type conversion adalah konversi antar type, bisa dari int ke double, atau double ke int, atau type – type yang lain.

Apa itu casting?? Casting lebih dari konversi type, tapi juga konversi expression. Bingung? Kita akan bahas pada tutorial ini.



Sudahkah anda hafal dengan type – type data berikut ini:
Long double
Double
Float
Unsigned long int
Long int
Unsigned int
Int
Dan lain lain
?? Hayo, coba di cari di internet bila lupa,, :P

Ah, kita langsung saja ke pokok bahasan, kita bagi saja menjadi Type

A.TYPE CONVERSION
Type conversion adalah conversi antar type. Coba perhatikan contoh berikut ini.

Saya punya sebuah data ber-type double,
double dValue = 3.14156;

saya juga punya sebuah data ber-type int,
int iValue = 3;

nah, sampai disini sudah tahu kan contoh data ber-type double dan int??? kalo belum jelas tentang type data, coba cari – cari di google dulu,, ayo,, :)

nah, bagaimana kalo saya balik,, seperti contoh berikut:

double dValue = 3;
int iValue = 3.14156;


anda bisa lihat, saya mengisi type data double dengan type data int (3), kemudian saya mengisi type data int dengan double (3.14156). Apakah yang akan terjadi??

Yup, semua baik baik saja :P, karena compiler sudah tahu apa yang harus dilakukan. Ya, compiler akan otomatis meng-konversi data int ke double dan data double ke int.

Inilah yang dinamakan dengan ‘implisit conversion’.

Dengan kode di atas, maka nilai ‘3’ dari variable ‘dValue’ akan menjadi double ‘3.0 ‘, sedangkan nilai 3.14 bla bla bla akan diubah menjadi int ‘3’. Bisa di pahami bukan??

Lihat gambar 1:


Nah, mari sekarang kita main – main dengan tambah- tambahan mateka – mateka,,

Coba perhatikan expression berikut:
Cout << 3 + 3.14156 << endl;

Perhatikan, kita menjumlahkan type data int (3) dengan type data double (3.14156), hayo tebak, hasilnya apa?? :P
Yup hasilnya adalah double 6.14156, INT + DOUBLE = DOUBLE, berarti compiler melakukan implicit conversion ke double.

Mari kita coba lagi,
cout << 3u + 3.14156 << endl;
Hasilnya 6.14156, UNSIGNED INT + DOUBLE = DOUBLE, berarti compiler melakukan implicit conversion ke double.

Saya akan coba lagi,
cout << 3u + 3 << endl;
Hasilnya adalah 6, UNSIGNED INT + INT = INT, berarti compiler melakukan implicit conversion ke int.

Sekarang mari coba lagi,
cout << 4.f + 3 << endl;
Hasilnya adalah 7, FLOAT + INT = INT, berarti compiler melakukan implicit conversion otomatis ke int.

Yup, perhatikan kembali type data yang saya tulis di atas. Itu adalah hirarki dalam type data, dimana long double adalah hirarki tertinggi, sedangkan int adalah hirarki terendah. Dalam C++, konversi akan menuju ke level hirarki di atas nya. :) jadi int akan menjadi double saat dijumplahkan dengan double, bukan tetap int.

Berikut adalah hirarki dalam type data.
Long double
Double
Float
Unsigned long int
Long int
Unsigned int
Int


Pasti ada pertanyaan, dimanakah type data yang lain seperti char dan short?? Nah, char dan short akan di jadikan int atau Unsigned Int dalam konversi . mudah dipahami kan?

Tapi apakah selalu seperti pada hirarki data tadi?? Tidak, bahkan banyak problem seperti berikut ini:
cout << 5u - 10 << endl;

‘5u’ adalah 5 tetapi bertype data Unsigned Integer. Coba tebak apakah hasilnya??

Bila anda menggunakan CodeBlock IDE dengan GCC atau Visual Studio 2013 update 1 (seperti punya saya) , maka anda akan mendapatkan nilai 4294967291. Loh ko begini??
Lihat gambar 2:


Nah, kembali ke penjumlahan diatas, saya akan mencoba lagi seperti ini misalnya:

Int a = 2;
Int b = 3;
float hi = a*b;
cout << hi << endl;


seperti pada gambar berikut:
Lihat gambar 3:


Ternyata, compiler mengalikan INT * INT.

Nah, dari sekian banyak contoh tadi, secara implicit compiler kita akan mengkonver secara otomatis sesuai dengan ‘peraturannya dia(compiler)’ sendiri. Nah, bagaimana bila saya ingin memberikan pengaturan lain supaya compiler tidak seenaknya sendiri ke int mulu??

Mudah, caranya adalah dengan explicit conversion , yang disebut dengan CASTING.

B.CASTING
Casting merupakan explicit conversion. Dalam pemrograman C, kita bisa melakukan casting hanya dengan operator () dimana type data diletakkan di dalamnya.

Int a = 2;
Int b = 3;
float hi = (float)a*b;
cout << hi << endl;


nah, anda bisa lihat, kita menambahkan (float) sebagai operator untuk casting int ke float. Ini adalah standar pemrograman C.
Sesuai dengan hirarki data di atas, bila a sudah menjadi float, maka data b nantinya mengikuti float :) , akhirnya, pembagian berada dalam proses float, bukan integer.

Selain itu, kita juga bisa menggunakan style casting pemrograman C yang lain seperti berikut ini:

Int a = 2;
Int b = 3;
float hi = float(a)*b;
cout << hi << endl;


keren bukan? Mudah bukan? Eit, jangan salah, penggunaan seperti ini dalam kode ini memang berjalan sempurna, tetapi penggunakan style bahasa C ini pun bermata dua, bisa menjadi bumerang bagi kita, karena style C ini bisa melakukan error diluar perkiraan.
Sehingga, C++ membuat type casting yang jauh lebih bagus ketimbang penggunaan C style ini.

Berikut merupakan type casting tersebut.
static_cast
reinterpret_cast
const_cast
dynamic_cast



STATIC_CAST
Untuk anda yang sering melakukan konversi type data, pasti sering mendapati ‘warning’ pada compilernya, seperti konversi berikut ini:

int nValue = 48;
char ch = nValue; // implicit cast


Nah, type integer (int) merupakan type data 4 bytes, sedangkan char adalah type data 1 bytes. Bila kita konversi dari int ke char tentu ada data yang lost (hilang) sehingga compiler akan memberikan warning bahwa konversi ‘unsafe’.
Penggunaan static_cast memiliki manfaat yang banyak dalam konversi unsafe ini. Bila anda ingin tetap konversi tanpa warning, anda bila melakukan seperti berikut ini:

int nValue = 48;
char ch = static_cast(nValue);


lihat, type data berada di ‘< >’.

Static_cast bisa digunakan pada banyak tipe konversi seperti:
-Standard konversi , seperti int ke short, short ke float, dan lain – lain
-Class conversion
-Juga konversi dari ‘Derived Class ke Base Class’

REINTERPRET_CAST
Reinterpret_cast digunakan untuk konversi antar type yang tidak ‘safe’ seperti:
-Konversi integers ke pointer
-Konversi pointer ke pointer
-Konversi antar function-pointer

Masih ingat tentang pointer kah?? Kalo tidak salah sih ‘pointer’ dalam C++ ini terkadang menyulitkan bagi programmer, sehingga di bahasa lain (Visual C#), pointer ini sudah dihilangkan.

Coba diingat ingat, *p ini bacanya apa?? Bacanya ‘value pointed by p’,
&p ini bacanya ‘address of p’.

Lihat gambar 4:


andy = 25, bacanya, value dari andi adalah 25.
ted = &andy, bacanya, value dari ted adalah ‘address of andy’, sehingga akan menghasilkan 1776. Ini adalah memory address dari andy.

fred = *ted, bacanya, nilai dari fred adalah ‘valued pointed by ted’, padahal ted adalah ‘1776’, sehingga ‘value pointed by ted’ adalah 25.

Mari kembali ke reinterpret_cast.

Berikut merupakan contoh reinterpret_cast:
char *ptr_my = reinterpret_cast(0xb0000);


kode di atas, kita mengkonversi dari integer ke char pointer.

CONST_CAST
Const_cast digunakan untuk mengkonversi / meng-cast ‘const properties’ dari object.
Taukah anda apa itu ‘const’? silahkan baca artikel berikut bila anda lupa apa itu const...
http://duramecho.com/ComputerInformation/WhyHowCppConst.html

ya, dalam bahasa indonesia adalah konstant, yang artinya tetap, nilai dari variable ini tidak bisa diubah ubah, lalu bagaimana casting/konversinya?

int a;

const char *ptr_my = "Hello";

a = const_cast(ptr_my);

a = reinterpret_cast(ptr_my);

a = reinterpret_cast(const_cast(ptr_my) );


Pada kode di atas, kita membuat sebuah integer a, lalu membuat sebuah char pointer yang bertype const (tetap).

Pada a pertama, kita mencoba mengkonver dari char pointer ke integer pointer. Hasilnya akan error, karena const_cast tidak bisa mengkonver dari char pointer ke int pointer.

Pada a kedua, kita menggunakan reinterpret_cast tidak bisa mengkonvert const. Nah, yang paling bisa dijadikan trik adalah a ketiga.


DYNAMIC_CAST

Nah, kalo yang ini digunakan untuk konversi/casting pointer dan references. Dynamic_cast ini sering digunakan untuk konversi class ke base class.

Contoh:

class Base_Class { };
class Derived_Class: public Base_Class { };

Base_Class a;
Base_Class * ptr_a;
Derived_Class b;
Derived_Class * ptr_b;

ptr_a = dynamic_cast(&b);
ptr_b = dynamic_cast(&a);


konversi pertama akan berhasil karena kita mengkonver dari derived class ke base class.

Konversi kedua akan error, karena kita mengkonver dari base ke derived class.

Konversi dari base class ke derived class dalam C++ tidak diizinkan kecuali bila keduanya adalah polymorphic.

Nah, ternyata banyak kan type conversi dan casting ini. Perlu diketahui bahwa semua yang tertulis ini adalah masih simple. Untuk tingkat advance, silahkan anda bisa mengeceknya di google.

Sampai jumpa kembali pada tutorial berikutnya.
Salam.

Sunday, 26 January 2014

C++ No.14: Apa itu namespace, bagaimana cara menggunakannya??


Sebelum ke pokok pembahasan, bila kita amati, hampir semua kode dalam tutorial kita sebelumnya selalu diawali dengan:

using namespace std;

Apasih maksudnya??? Maksudnya adalah kita memanggil namespace yang memiliki nama ‘std’. Namespace ‘std’ merupakan standar namespace dari C++ yang dapat kita gunakan untuk memanggil class/object/fungsi yang terdapat di dalam namespace tersebut. Yup, tentu yang kita panggil dan selalu kita gunakan pada tutorial sebelumnya adalah cout dan cin :) . Bayangkan bila anda tidak mengetikan:

using namespace std;

Pasti anda tidak akan bisa menggunakan :

cout << a << endl;

Karena fungsi dari ‘cout’ itu sendiri berada di dalam namespace std yang harus kita definisikan di awal kode. Jadi, apa itu namespace??



Saya menggunakan Microsoft Visual Studio 2013 (IDE terbaru saat artikel ini ditulis). Untuk anda yang menggunakan software lain adalah sama saja penulisannya.

Namespace merupakan group atau kumpulan entities (class, object, function) yang dikelompokkan dalam satu nama. Perhatikan kode berikut ini, kita akan membuat sebuah namespace baru dengan nama mediatutorial.
Lihat gambar 1:


Lihat, kita membuat namespace, kita berikan nama ‘mediatutorial’ dan isi dari namespace tersebut adalah entities yang berupa variable a dan b. Variable ini berjenis integer (int). Mudah bukan?

Mari kita membuat namespace yang lain,
Lihat gambar 2:


Nah, kita kemudian membuat sebuah namespace baru, gampang kan cara membuat namespase yang baru ini?
Lalu bagaimana cara memanggilnya???
OK, perhatikan kode berikutnya,
Lihat gambar 3:


Gampang bukan???

Nah, untuk pemanggilan namespace itu sendiri kita dapat menggunakan nama dari namespace diikuti operator “ :: “. Contohnya pada kode di atas.

Selain itu kita juga bisa menggunakan ‘using’. Caranya adalah seperti pada kode berikut ini,
Lihat gambar 4:


Bila kita menggunakan using SEPERTI PADA KODE DI A TAS, maka kita tidak perlu menggunakan nama namespace diikuti ::, cukup langsung nama variable nya saja.

Nah, bisa juga menggunakan using SEPERTI DI BAWAH INI,
Lihat gambar 5:


Bila kita menggunakan using SEPERTI KODE TERSEBUT maka kita masih menggunakan ::. Ternyata banyak sekali bukan penulisan – penulisannya??

Apakah hanya sebatas itu?? Tidak, kita bisa menggabung – gabungkan penulisannya seperti pada kode berikut ini,
Lihat gambar 6:


Mudah bukan, kita bisa memakai gaya apa saja, entah itu pakai:

Using namespace mediatutorial;

Atau

Using mediatutorial:a;
Atau

Mediatutorial:a;

Sebetulnya apa sih fungsi dari namespace itu? Fungsi dari namespace adalah untuk meng-spesifikasi entities (class, function, variable) yang ada di dalam namespace, sehingga bila kita memiliki variable atau fungsi yang sama maka tidak akan saling bentrok dan overwrite.

Bayangkan bila anda membuat sebuah variable yang memiliki nama yang sama. Apa yang terjadi bila variable yang anda buat tersebut memiliki nama yang sama.

Apa yang terjadi bila fungsi yang anda buat memilki nama yang sama?

Ya, pasti akan di-overwrite atau error.

Nah, dengan namespace, kita bisa memanggil fungsi atau variable secara sendiri – sendiri meski variable atau fungsi tersebut memiliki nama yang sama.
Berikut merupakan contohnya:
Lihat gambar 7:


Nah, anda bisa lihat, kita sama sama membuat fungsi dengan nama ‘berapa’. Dengan menggunakan namespace maka tidak ada terjadi overwrite pada fungsi.

Mudah bukan pengertian apa itu namespace?? Mudah mudahan bermanfaat dan sampai jumpa kembali pada tutorial berikutnya.

Salam.

Monday, 20 January 2014

C++ No.13: Function Templates dan Class Templates


Tahukah anda apa itu templates? Templates bisa dibilang merupakan kerangka atau rancangan. Fungsi kerangka ini adalah untuk mempercepat kita membuat body nya. Anda kenal Codeigniter?? bisa dibilang Codeigniter itu adalah template code, meskipun lebih populer dengan Framework. Pernahkah anda menggunakan blogspot dan merubah templatenya??? Nah, kalo dalam blogspot itu adalah template untuk tampilan/appearance. Pada tutorial ini kita akan membahas tentang template code. :)


Template bisa dibilang merupakan smart coding. Mengapa? Karena kita hanya membuat rancangan saja. Bila anda berkecipung di bidang pemrograman GUI, anda akan mengenal GUI templates seperti QT, WxWidgets, Windows Api. Ya, ini adalah templates GUI, dengan menggunakan template ini kita tidak perlu membuat GUI sendiri, kita tinggal berfikir logic nya, sementara GUI telah disediakan oleh vendor. Enak bukan?

Coba perhatikan kode berikut:
a + b = c

Kita bisa mengisikan nilai apa saja ke dalam a, b, bukan?? Ini juga bisa di bilang template sederhana. Karena kita bisa memasukan bilangan apa saja ke dalam variable a, b, dan c.

Kode di atas lebih bermanfaat dan bisa digunakan setiap saat ketimbang 1 + 2 = 3 benar bukan??

Lalu bagaimana dengan templates dalam C++ ??

Yup, C++ menyediakan sebuah template pengkodean yaitu function templates dan class templates. Kita akan membahas satu persatu dalam tutorial ini.

A.FUNCTION TEMPLATES
Function template merupakan templates untuk fungsi / method. Penulisan template untuk function adalah sebagai berikut:
Lihat Gambar 1:


Nah, anda bisa perhatikan function template di atas. Template selalu di awali dengan kata ‘template’ diikuti dengan <>. Kita memiliki sebuah type dari variable yaitu ‘typeDataKu’. Ini bisa anda ubah dengan type data apa saja. Mari kita coba membuat sebuah fungsi tanpa template untuk dua buah type data berbeda.

Sebentar, tahukah anda apa itu type data??? :)

Perhatikan gambar berikut, kita membuat tiga buah function, masing masing function bertype int, long, dan double :
Lihat gambar 2:


Wah, kita membuat fungsi yang betul betul mirip, hanya type data saja yang beda bukan? Alangkah efektif dan efisien bila kita membuat sebuah template yang bisa meng-handle tidak hanya variable tapi juga type datanya.

Berikut merupakan templatenya, kalo pada contoh awal tutorial kita menggunakan ‘typeDataku’, sekarang kita akan menggunakan ‘T’. Yup, kebanyakan programmer menggunakan T saja sebagai pengganti nama yang lebih singkat.
Lihat gambar 3:


Simple bukan?? Lalu bagaimana cara memanggilnya??? Simple juga, perhatikan kode di bawah ini:
Lihat gambar 4:


Anda bisa lihat, untuk menggunakan function templates kita menggunakan format sebagai berikut:

function_name (parameter);

perlu diketahui bahwa penggunakan hanya digunakan saat type fungsi kita berbeda beda, coba lihat di atas, kita memiliki variable dari type fungsi yang berbeda-beda, ada int, ada long, double. Bila kita hanya memiliki satu type saja, int misalnya, maka kita tidak perlu menggunakan . Coba perhatikan contoh berikut ini:
Lihat gambar 5:


Nah, anda bisa lihat, kita hanya menggunakan int, jadi kita tidak perlu menggunakan , , karena hanya ada satu (int) yang diterapkan oleh function tambah.

Mudah bukan?

Berikut adalah contoh kodenya:
Lihat gambar 6:


B.CLASS TEMPLATES
Class templates ini pada dasarnya sama dengan Function template di atas, hanya saja ini untuk class. Coba bayangkan, , (yuk kita bayangkan :) ) , anda memiliki sebuah class, anda ingin class ini bisa menghandle banyak type data sekaligus, nah, apa yang akan anda lakukan untuk mempersingkat penulisan???

Coba perhatikan class saya yang SALAH berikut ini.
Lihat gambar 7:


Lihat gambar di atas, kita membuat banyak class untuk sebuah fungsi yang pekerjaannya sama. Hal ini akan sangat tidak efisien, maka dari itu kita bisa menggunakan Class template seperti di bawah ini:

Lihat gambar 8:


Nah, anda bisa lihat, class dan fungsi kita sebelumnya kita sederhanakan menjadi seperti pada gambar. Nah, kemudian bagaimana penerapannya??? Mudah saja, silahkan lihat kode berikut ini.
Lihat gambar 9:



Mudah sekali bukan penerapan dari Class Template ini??

Nah, ada kasus baru, bagaimana bila kita membuat satu class, tapi satu class ini kita buat perlakuan yang berbeda untuk setiap type. Bingung??? Di awal kan kita sudah membuat perlakuan yang sama pada type berbeda, baik int, long, doble kita berlakukan fungsi yang sama. Bagaimana bila kita berikan perlakuan yang berbeda untuk int dan long?? :)

Perlakuan yang berbeda ini kalo dalam C++ bahasa kerennya adalah template specialization.

Sebagai contoh, saya akan membuat 2 buah file type yaitu int dan char. Semua nya berada dalam satu class templates inputku misalnya.

Lihat gambar 9:


Lihat gambar di atas, pertama kita akan membuat class template untuk bilangan int. Lihat, kode di atas hanya berlaku untuk type int bukan??? Nah, bagaimana kalo kita ingin memberikan perlakuan untuk bilangan tidak type int, char misalnya. Kita akan mengetikan kode seperti berikut ini:

Lihat gambar 11:


Nah, di atas kita membuat class yang sama dan fungsi yang sama dengan template specialization. Anda bisa lihat, kita memberikan perlakuan pada type char (di sini kita memasukan input nya adalah a.

Untuk penulisan template specialization sendiri adalah seperti pada gambar di atas yang saya block biru. Kemudian implementasinya saya tandai lingkaran merah.
Intinya kita hanya perlu menambahkan template<> saja. Serta pada fungsi kita harus menyetakan type data nya.

char tambahSatu(char myinput)

bukan

T tambahSatu(T myinput)

Demikian tutorial basic tentang function template dan class template, semoga bermanfaat dan sampai jumpa kembali pada tutorial berikutnya.
Salam.

Sunday, 5 January 2014

C++ No.12: Polymorphism pada C++, apa itu polymorphism?

Polymorphism merupakan konsep dalam bahasa pemrograman berorientasi object. Bila kita mempelajari, mengetikan, membuat sebuah program dengan bahasa OOP pasti secara langsung kita berhubungan dengan istilah Polymorphism. Kita mengetikan model pemrograman dengan pointer, abstract class, virtual member, dan lain – lain sebetulnya semua itu adalah bagian dari polymorphism.

Apa itu Polymorphism?

Dilihat dari bahasanya, poly berarti banyak, morphis berarti bentuk. Jadi polymorphism adalah pemrograman yang punya banyak bentuk. Bentuk maksudnya gimana sih??
Bentuk disini bisa diartikan sebagai model, ragam, atau jenis, seperti misalnya dalam C++ kita mengenal virtual member, pointer, abstract class dan lain – lain. nah, aneka ragam seperti inilah yang disebut dengan polymorphism.



Pada gambar di atas kita mengupload gambar tentang polymorphic dari class felix menjadi kucing, harimau, macan tutul :)

Penulisannya pun beragam, bervariasi, kreatif, simple, dan lain lain. Inilah polymorphism, jadi tidak monoton tanpa improvisasi sama sekali.

Pada tutorial Polymorphism kali ini, kita akan membahas beberapa hal sebagai berikut:
1.Pointer dan Base Class (ingat, ini juga kelanjutan dari tutorial inheritance lho)
2.Virtual member dan Pure Virtual Member
3.Abstract Base Class

Semua tentang 3 point di atas, di bahas pada video tutorial berikut ini:
Saya menggunakan Microsoft Visual Studio 2013, untuk pengguna software lain, anda dapat menyesuaikan.


ANDA DAPAT MELIHAT TUTORIALNYA DI BAWAH INI

Video di atas dapat anda download dengan menggunakan IDM (Internet Download Manager) atau aplikasi downloader yang lain yang telah terinstall di komputer anda.

Sunday, 29 December 2013

C++ No.11: INHERITANCE antar Class, apa itu inheritance?


Apa itu inheritance, derived class , dan base class?? Pasti untuk seorang yang baru mengenal bahasa pemrograman berorientasi object akan sangat membingungkan. Inheritance adalah sebuah keistimewaan bahasa yang ber-orientasi object (OOP) tidak hanya C++ tetapi juga bahasa yang lain. Berikut adalah penjelasan singkatnya:

Inheritance = Pewarisan
Derived class = Class turunan
Base Class = Class Utama

contoh:
class Segitiga: public BagunDatar{ };

Artinya:
Class Segitiga adalah derived class (class yang diturunkan.
Class Polygon adalah base class (class utama).
Semua yang dimiliki oleh class utama akan dimiliki juga oleh class turunannya (pengecualian akan kita bahas di tulisan bawah artikel ini).
Keadaan seperti di atas di sebut inheritance (pewarisan).


Di dalam inheritance (pewarisan) tentu kita akan berfikir, siapa yang mewariskan? siapa yang di wariskan??? dan warisannya itu apa?? :)
Sama seperti manusia, yang mewariskan adalah orang tua, yang diwarisi adalah anak, warisannya itu bisa berupa sifat dari kedua orang tua :)

Dalam Object Oriented Programming, yang mewariskan disebut sebagai Base Class, yang diwarisi disebut sebagai Derived Class , dan warisannya itu berupa 'members' dari class yaitu variable dan function.

Untuk lebih gampang di pahami, mari kita mengetikan beberapa baris kode, anda kenal kan dengan yang namanya 'Segitiga'??? kenal juga kan dengan yang namanya 'Kotak'?? Kotak dan Segitiga ini sama sama bangun datar ya kan??? Si Kotak dan Si Segitiga ini beda, tapi mereka sama sama punya 'dasar' dan 'tinggi', ya kan??

Nah, kita akan mengetikan kode dari Si Segitiga, Si Kotak, dan Bangun Datar ini aja biar lebih mudah. Kita akan buat base class nya adalah Bangun Datar, derived class nya adalah Kotak dan Segitiga.

Kita akan mempraktekkannya menggunakan CodeBlocks terbaru (13.12) MingGW, dengan GCC 4.7.*** anda bisa menggunakan Kode Editor dan Compiler lain favorit anda.
Kenapa memakai CodeBlocks??? Karena ukurannya kecil, bisa masuk di Flashdisk dan bisa saya install di mana - mana saat waktu senggang :)

Lihat gambar 1:

Pertama, kita akan membuat sebuah Main.cpp , kita mengetikan Class pertama yang akan kita gunakan sebagai base class. Class ini kita berikan nama BangunDatar.
Perhatikan gambar di atas, kita membuat member class yang berupa dua variables dan satu fungsi.

Variable – variable tersebut adalah lebar dan tinggi dengan type data adalah integer (int) dengan ‘access specifier’ protected.
Sedangkan untuk fungsi nya adalah set_values() yang kita berikan void dan ‘access specifier’ nya public.

Sampai di sini pasti banyak pertanyaan.
*Kenapa memakai protected?
*Kenapa int?
*kenapa public?
*Kenapa void?

Protected access specifier akan mem-protect/ melindungi member/variable dari pengakses-san di luar class BangunDatar. Bila anda memiliki class lain yang tidak ada hubungannya dengan class BangunDatar maka anda tidak akan bisa mengakses variable ini terlebih mengubah nilainya.

Tetapi dengan kita menjadikan Class lain sebagai ‘Derived Class’ / ‘Class Turunan’ , maka Class turunan tersebut akan memiliki varible dari Base Class ini. Hebat bukan?

Kenapa menggunakan type data int?? karena kita hanya ingin nilai yang masuk ke dalam variable lebar dan tinggi adalah angka (interger) :)

Kenapa public?? Ini hanya access specifier, kita ingin supaya function /method ‘set_values()’ ini dapat di akses oleh Class apa saja :)

Lalu kenapa void?? Function /Method ‘set_values()’ tidak me-return apa pun, fungsi ini hanya untuk mengeset nilai dari lebar dan tinggi, sehingga cukup memakai void saja :)

Nah, perlu anda ingat, kita membuat sebuah Class ‘BangunDatar’ dengan variable lebar dan tinggi serta dengan fungsi set_values().

Mari kita ketikan class lain sebagai class turunannya.

Lihat gambar 2:

Lihat, kita membuat sebuah class baru yang merupakan ‘Derived Class’ dari class BangunDatar. Tanda colon ( : ) / titik dua merupakan tanda inheritance.

Class yang kita buat ini hanya memiliki member berupa fungsi luas() saja. Tetapi dari fungsi luas ini, kita bisa memanggil variable lebar dan tinggi miliknya class BangunDatar. Inilah gunanya inheritance :)

Class Kotak ini nantinya akan memiliki semua member dari class BangunDatar termasuk fungsi set_values juga.

Mari kita membuat class baru sebagai class turunan lain dari class BangunDatar.

Lihat gambar 3:


Perhatikan class Segitiga di atas, adakah yang tahu rumus luas segitiga?? :) Yup, rumus luas segitiga sama dengan rumus luas kotak dibagi dua.

Nah, karena class segitiga merupakan class turunan dari class BangunDatar, kita tidak perlu membuat / mendefinisikan variable lebar dan tinggi yang baru, cukup menggunakan variable yang sudah ada pada class BangunDatar.

Sampai di sini mudah dimengerti kan?? Mari kita melanjutkan kode kita selanjutnya. Kita akan membuat main function nya.

Lihat gambar 4:

Kode di atas adalah fungsi main c++ kita, kita membuat sebuah object baru (ini object lho, bukan variable atau function) yaitu ‘kotakku’ dan ‘segitigaku’ yang dibuat dari class nya masing masing.

Nah, dari object tadi, kita memanggil fungsi dari base class BangunDatar yaitu fungsi set_values. Ingat, semua member dari class BangunDatar (variable lebar, tinggi, fungsi set_values) akan diturunkan ke derived class nya :)

Setelah kita meng-set nilai untuk panjang dan lebar dari masing masing object, kita kemudian memanggil fungsi luas dari masing masing object tersebut. Mudah bukan….

Berikut adalah hasilnya:

Lihat gambar 5:


Nah, kemudian bagaimana dengan multiple inheritance???
Coba perhatikan kode berikut ini:

class Kotak: public BangunDatar, public Tampilkan{

};


Kode di atas adalah contoh dari multiple inheritance. Prinsip nya adalah sama dengan penjelasan di atas.

Mari kita membuat class baru seperti pada gambar berikut ini.

Lihat gambar 6:

Kita membuat sebuah class Tampilkan, dalam class tersebut kita membuat sebuah method / function Say(). Kita memberikan access specifier ‘public’. Function void hanya akan menampilkan string.

Nah, kita akan mencoba membuat class ini sebagai base class dari kotak maupun segitiga kita tadi.

Lihat gambar 7:


Lihat, mudah bukan membuat multiple inheritance, sekarang mari kita tambahkan di main function nya.

Lihat gambar 8:

Nah, hasilnya adalah sebagai berikut ini:
Lihat gambar 9:

Selesai, mudah kan,,,
Berikut kita sertakan kode full nya:



Sekian tutorial tentang inheritance, mudah mudahan bermanfaat, salam.

Saturday, 30 November 2013

C++ No.10: Mengenal Pointers, Reference Operator (&) dan Dereference Operator (*)


Kita lupakan sejenak Class, kita akan terlebih dahulu mengenal Pointers, Reference Operator (&) dan Dereference Operator (*)

Tahukah anda bahwa setiap variable yang kita buat akan tersimpan di dalam memory cell komputer?

Tahukah anda bahwa memory komputer kita terdiri dari memory cell – memory cell dengan ukuran terkecil adalah 1 byte?

Tahukah anda bahwa memory cell – memory cell ini terpetakan pada komputer dengan nomor unik yang disebut dengan nomor address?

Tidak percaya? Cobalah ketikan kode di bawah ini kemudian run, lihat, dengan menggunakan reference operator (&) kita bisa mengetahui pada address keberapa variable kita tersimpan di memory :)

Pointer, sesuai dengan namanya, fungsinya adalah untuk penunjuk, entah itu penunjuk ke variable, penunjuk ke fungsi, atau penunjuk ke object/class.

Di dalam pointer, kita akan mengenal sebuah reference operator dengan tanda ‘&’ yang memiliki arti ‘address of’.

Kita juga akan mengenal sebuah dereference operator dengan tanda ‘*’ yang mempunyai arti ‘value pointed by’. Kalo di indonesiakan adalah ‘nilai yang direferensikan oleh..’.

Reference operator (&) dan Dereference operator (*) merupakan saling berkebalikan.

Address of’ disini maksudnya adalah address dari variable/fungsi tersebut di dalam memory cell. Perhatikan kode di atas, &panjang akan menampilkan address dari variable panjang pada memory cell. Nilai yang akan ditampilan beragam, bisa 001284, bisa 002355, bisa 123456, ini adalah address/alamat angka dari variable yang tersimpan pada memory cell.

Value pointed by’ disini maksudnya adalah nilai dari variable yang direferensikan. Coba perhatikan contoh berikut ini:
Gambar 1:

Lihat kode di atas, kita membuat variable dengan type int yaitu variable panjang dan variable lebar. Kemudian kita membuat sebuah pointer variable dengan dereference operator , yaitu pointer variable *a. ingat, ini adalah pointer variable. Bacanya adalah ‘value pointed by a’.

Nah, sekarang perhatikan variable a (bukan pointer variable a), kita memberikan nilai dari variable a adalah ‘address of panjang’ yaitu pada kode a = &panjang;

Lalu bila a = &panjang; maka berapakah nilah *a?

Bisa dipastikan a akan berisi memory address dari panjang, dan *a akan berisi nilai dari panjang yaitu 100;
Coba lihat hasil dari kode di atas:
Gambar 2:

Bisa dibilang, * dan & saling berkebalikan. Masih bingung juga? Perhatikan dan bacalah kode berikut ini:
Gambar 3:

Nilai dari a dan *a adalah berbeda, hasilnya adalah seperti berikut ini:
Gambar 4:

Nah, ada ebook bagus yang membahas tentang Pointer ini, silahkan saja download di https://drive.google.com/file/d/0B6_ki5nuY_ysZ1lZRHFDUnpMNFU/edit?usp=sharing

Mudah bukan, ingat, ini adalah tutorial singkat tentang pointer. Di atas adalah tutorial pointer to variables. Di internet, banyak sekali tutorial tingkat lanjut tentang pointer ini salah satunya adalah pointer to functions. Silahkan anda dapat mencarinya di google :)
Sekian semoga bermanfaat.