Monday, 20 November 2017

C++ - namespace

C++ - Contoh Program namespace

#include <iostream>
#include <conio.h>
using namespace std;

void info()
{
      cout<<"Mobil X punya 4 pintu"<<endl;
}

void info()
{
      cout<<"Mobil Y punya 2 pintu"<<endl;
}

int main()
{
    info();
     
      _getche();
    return 0;
}

     Apabila dicompile program di atas akan memunculkan pesan error, karena fungsi yang mempunyai nama yang sama yaitu void info()didefinisikan dua kali. Padahal tidak diperbolehkan suatu definisi nama variabel, fungsi, atau kelas, dll dengan nama yang sama lebih dari satu kali. Walaupun jika diperhatikan kedua fungsi tersebut digunakan untuk tujuan yang berbeda.

Program di atas adalah contoh sederhana, mungkin karena saking sederhananya kita cukup mengubah nama fungsinya dan masalah pun selesai. Namun bagaimana jika kita sedang membuat sebuah proyek yang besar yang melibatkan banyak library, misalkan kita mempunyai fungsi cetak() dan fungsi cetak() lain yang berada pada library yang berbeda serta fungsi dengan nama cetak() lain di library lainnya, yang mempunyai tugas yang berbeda. Hal ini membuat compiler kebingungan untuk memilih fungsi cetak() mana yang sebenarnya kita maksud. C++ mempunyai solusi untuk mengatasi kesulitan/permasalahan ini, yaitu namespace.

Lalu, apa itu namespace?
namespace dapat diibaratkan seperti wadah atau grup yang digunakan untuk mengelompokkan fungsi atau data lainnya sehingga menjadi dapat dibedakan. Misalkan jika kita ingin menggunakan fungsi cetak() maka dengan namespace compiler akan tahu dengan pasti fungsi cetak() mana yang dimaksudkan untuk dieksekusi. Dengan namespace juga kita tidak perlu menyiapkan nama yang berbeda-beda seperti cetak1(), cetak2(), cetak3(),..., dll.


Bentuk penulisan namespace:
namespace <nama_namespace>
{
//blok kode
}


Bentuk penulisan pemanggilan variabel/fungsi pada namespace:
<nama_namespace>::<nama_variabel/fungsi>;


Berikut adalah contoh program penggunaan namespace c++ :
/*
      C++ - namespace
      Microsoft Visual Studio Express 2012
      [RS]
*/

#include <iostream>
#include <conio.h>
using namespace std;

//namespace info rumah
namespace info_rmh{
      char warna[]= "Merah";
      int jumlah = 3;
      void info()
      {
            cout<<"Rumah berwarna "<<warna<<" itu punya "<<jumlah<<" pintu."<<endl;
      }
}

//namespace info mobil
namespace info_mbl{
      char warna[]="Hitam";
      int jumlah = 4;
      void info()
      {
            cout<<"Mobil berwarna "<<warna<<" itu punya "<<jumlah<<" pintu."<<endl;
      }
}

int main()
{
cout<<"NAMESPACE"<<endl;
cout<<"---------"<<endl;

//memanggil variabel dan fungsi pada namespace info_rmh
cout<<"Warna rumah  : "<<info_rmh::warna<<endl;
cout<<"Jumlah pintu : "<<info_rmh::jumlah<<endl;
info_rmh::info();

cout<<endl;

//memanggil variabel dan fungsi pada namespace info_mbl
cout<<"Warna mobil  : "<<info_mbl::warna<<endl;
cout<<"Jumlah pintu : "<<info_mbl::jumlah<<endl;
info_mbl::info();
     
_getche();
return 0;
}

Output
NAMESPACE
---------
Warna rumah : Merah
Jumlah pintu : 3
Rumah berwarna Merah itu punya 3 pintu.

Warna mobil : Hitam
Jumlah pintu : 4
Mobil berwarna Hitam itu punya 4 pintu.

Penjelasan
Dengan menggunakan namespace seperti program di atas, program tidak akan memunculkan pesan error saat dicompile, seperti kode program sebelumnya. info_rmh:: digunakan untuk memanggil variabel/fungsi yang didefinisikan pada namespace info_rmh, sedangkan info_mbl:: digunakan untuk memanggil varibel/fungsi yang didefinisikan pada namespace info_mbl.

Menggunakan using
Kita dapat menggunakan using agar setiap kali kita menggunakan suatu namespace kita tidak perlu menggunakan bentuk <nama_namespace>::<code> setiap pemanggilan, hanya cukup sekali saja.
1. using <nama_namespace>::<code>;
Penggunaan using di atas dimaksudkan jika kita ingin merujuk pada item/code tertentu dalam suatu namespace.


Contoh program menggunakan using untuk code tertentu dalam namespace :
/*
      C++ - namespace
      Microsoft Visual Studio Express 2012
      [RS]
*/
#include <iostream>
#include <conio.h>
using namespace std;

#define tampil cout
#define akhiribaris endl

//namespace
namespace nmsp{
      int sp_x = 10;
      int sp_y = 20;
      int sp_z = 30;
}

using nmsp::sp_x;
using nmsp::sp_y;
int main()
{
      cout<<"NAMESPACE"<<endl;
      cout<<"---------"<<endl;
     
      //menampilkan nilai variabel pada namespace nmsp
      cout<<"Nilai sp_x : "<<sp_x<<endl;
      cout<<"Nilai sp_y : "<<sp_y<<endl;
      cout<<"Nilai sp_z : "<<nmsp::sp_z<<endl;
      cout<<endl;

      //asal
      tampil<<"Hello wolrd!"<<akhiribaris;
     
      _getche();
    return 0;
}

2. using namespace <nama_namespace>;
Penggunaan using namespace di atas dimaksudkan jika kita ingin merujuk pada semua item/code yang berada dalam suatu namespace.

Contoh program menggunakan using namespace :
/*
      C++ - namespace
      Microsoft Visual Studio Express 2012
      [RS]
*/
#include <iostream>
#include <conio.h>
using namespace std;

//namespace
namespace nmsp{
      int sp_x = 10;
      int sp_y = 20;
      int sp_z = 30;
}

using namespace nmsp;
int main()
{
      cout<<"NAMESPACE"<<endl;
      cout<<"---------"<<endl;
     
      //menampilkan nilai variabel pada namespace nmsp
      cout<<"Nilai sp_x : "<<sp_x<<endl;
      cout<<"Nilai sp_y : "<<sp_y<<endl;
      cout<<"Nilai sp_z : "<<sp_z<<endl;
      cout<<endl;

      _getche();
    return 0;
}

Output kedua program di atas
NAMESPACE
---------
Nilai sp_x : 10
Nilai sp_y : 20
Nilai sp_z : 30

Penjelasan
Perhatikan penulisan program di atas, pada program using 1, karena terdapat pernyataan usingnmsp::sp_x;using nmsp::sp_y; maka pemanggilan variabel sp_x dan sp_y pada fungsi main tidak perlu diawalil dengan nama namespace terlebih dulu. Namun tidak demikian dengan variabel sp_z.

Sedangkan pada program using 2, karena terdapat pernyataan using namespace nmsp; yang artinya merujuk pada semua item/kode pada namespace nmsp;, maka pemanggilan sp_x, sp_y, dansp_z variabel pada fungsi main tidak perlu diawali dengan nama namespace terlebih dulu.

Bagaimana dengan using namespace std; ?
Variabel, tipe, konstanta, dan fungsi pada standard library c++ dideklarasikan di dalam namespace std, termasuk cout, cin, endl, dll. Jadi ketika kita ingin menggunakan cout, cin, dan endl maka kita harus menggunakan namespace std seperti program di bawah ini:

#include <iostream>
#include <conio.h>
using namespace std;

int main()
{
      char hi [15];
      cout<<"Ketikkan string : ";
      cin>>hi;

      cout<<endl;
      cout<<hi<<endl;

      _getche();
      return 0;
}
Atau jika tidak menggunakan using namespace std; maka program di atas menjadi:
#include <iostream>
#include <conio.h>

int main()
{
      char hi [15];
      std::cout<<"Ketikkan string : ";
      std::cin>>hi;

      std::cout<<std::endl;
      std::cout<<hi<<std::endl;

      _getche();
      return 0;
}

Output kedua program di atas sama
Ketikkan string : Hello

Hello


Mungkin akan muncul pertanyaan seperti ini, “Jika cout, cin berada pada namespace std lalu kenapa header iostream juga harus disertakan?”
Jawabnya :
Pada namespace std kurang lebih pendeklarasiannya seperti berikut.


namespace std
{
ostream cout;
istream cin;
//..
//..
};


Memang benar cout dan cin berada pada namespace std, namun ostream dan istream yang digunakan untuk metode input/output definisikan di dalam header <iostream> sehingga tanpa header iniostream dan istream tidak akan dikenali oleh compiler. Jadi, untuk menggunakan cout dan cin harus menyertakan keduanya yaitu, header iostream dan namespace std.

Sumber: http://www.nblognlife.com/2017/04/c-namespace.html

No comments:

Post a Comment