TYPECASTING DAN RTTI
19.3 Menggunakan Namespace
Setelah Anda mengetahui cara mendefinisikan sebuah namespace, maka hal selanjutnya yang perlu dipahami adalah bagaimana cara untuk menggunakannya di dalam program. Dengan kata lain, bagaimana kita dapat mengakses variabel, konstanta, fungsi maupun kelas yang dideklarasikan dalam sebuah namespace.
Bab 19: Namespace
Terdapat dua buah cara untuk melakukan hal ini, yaitu dengan menggunakan operator scope resolution (: :) dan menggunakan kata kunci using. Berikut ini penjelasan dari masing-masing cara tersebut.
19.3.1 Menggunakan Operator Scope Resolution (::)
Untuk dapat memanggil variabel, konstanta, fungsi maupun kelas yang terdapat di dalam sebuah namespace, kita dapat menggunakan operator : :, yaitu dengan cara seperti di bawah ini.
Berikut ini contoh program yang akan menunjukkan penggunaan operator : : kaitannya dengan namespace.
#in usi
it main ()
// mengakses dan mengisikan nilai x yang terdaj // di dalam namespace A
A::x = 100;
cout«"Nilai x di dalam namespace A : "«A: :x«endl;
// memanggil fungsi setx{) yang terdapat di dalam namespace A A::setx(200);
'/ memanggil fungsi getx{) yang terdapat di dalam namespace A :out«"Nilai x di dalam namespace A : "«A: :getx{ }«endl;
retui
-Apabila dijalankan, program di atas akan memberikan hasil seperti berikut:
Pemrograman
Nilai x di dalam namespace A : 100 Nilai x di dalam namespace A : 200
Tampak pada kode di atas bahwa kita dapat melakukan pemanggilan variabel x dari fungsi utama atau fungsi main ( ) dengan menggunakan A: : x. Mula-mula kita isikan nilai ke dalam variabel x dengan nilai 100. Selanjutnya pada baris berikutnya kita memanggil fungsi setx ( ) dengan menggunakan A: : setx ( 2 0 0 ) . Ini artinya kita mengubah nilai x menjadi 200 sehingga pada saat nilai tersebut dipanggil lagi dengan perintah A: : getx ( ) , maka yang akan ditampilkan adalah nilai x terakhir, yaitu 200.
Selanjutnya, di sini kita akan membahas bagaimana cara menggunakan kelas yang terdapat di dalam namespace. Namun sebelumnya, coba Anda perhatikan terlebih dahulu contoh program berikut ini.
#include <iostream>
using namespace std;
namespace NS { class Titik { private:
f, ... int x;,, int y;
public:
void setKoordinat(int nilaix, int nilaiy) { x = nilaix;
y = nilaiy;
void geserVertikal (int deltay) { y += deltay;
}
void geserHorisontal (int deltax) { x += deltax;
void cetakKoordinat ( ) {
cout« " Koordinat : ( " «x« " , " «y« " ) " «endl ,
int main() {
// Melakukan instansiasi kelas Titik Bab 19: Namespace
JS::Titik A;
// mengeset nilai koordinat awal L.setKoordinat(2, 5);
ucetakKoordiriat () ;
// menggeser 2 nilai ke bawah ..geserVertikal (-2) ;
:out«" \nSetelah digeser 2 nilai ke bawah ..cetakKoordinat () ;
// menggeset 3 nilai ke kanan i.geserHorisontal (3) ;
cout<-:" \nSetelah digeset 3 nilai k
k. cetakKoordinat () return 0;
Hasil yang akan diberikan dari program di atas adalah sebagai berikut:
Koordinat: (2, 5)
Setelah digeser 2 nilai ke bawah Koordinat : (2, 3)
Setelah digeser 3 nilai ke kanan Koordinat: (5, 3)
Perhatikan kembali kode:
Maksud dari kode di atas adalah mendeklarasikan objek A yang mengacu ke kelas Titik yang terdapat pada namespace NS.
Setelah melakukan instansiasi objek di atas, maka kita dapat memanggil member function yang terdapat pada kelas Titik melalui objek A.
19.3.2 Menggunakan Kata Kunci using
Sebelum kita membahas lebih jauh mengenai penggunaan kata kunci using, coba Anda perhatikan terlebih dahulu contoh program sederhana di bawah ini.
Pemrograman C+^
Kode Program 19-3
#include <iostream>
int main() {
I
int bilangan;•std::cout« "Masukkan sebuah bilangan bulat: ";
std: :cin»bilangan;
std: :cout«"Bilangan yang Anda masukkan adalah
"«std: :endl return 0;
}
Dapat kita lihat pada contoh kode di atas bahwa kita menggunakan cout, cin dan endl yang semuanya berada di dalam namespace std (namespace yang telah disediakan oleh kompiler C++). Di sini kita menggunakan operator scope resolution (::) setiap kali melakukan pemanggilan terhadap cout, cin maupun endl.
Sekarang coba Anda bayangkan apabila di dalam program yang kita buat terdapat banyak sekali penggunaan cout, cin maupun endl? Apakah kita akan selalu menuliskannya dengan cara std: : cout, std: : cin maupun std: : endl? Hal ini tentu akan sangat merepotkan. Maka dari itu, untuk meningkatkan efisiensi kode program yang kita tulis, C++ menyediakan kata kunci using untuk memberikan solusi atas masalah seperti ini.
Terdapat dua buah cara untuk menggunakan kata kunci using, yaitu sebagai berikut:
using nama namespace::member;
dan
using namespace nama _ namespace/
Berikut ini penjelasan dari masing-masing bentuk di atas. Bentuk pertama digunakan apabila kita hanya akan menggunakan sebuah anggota (member) namespace saja. Sebagai contoh, apabila di dalam program yang kita buat kita hanya akan menggunakan cout saja (tanpa menggunakan cin dan endl), maka kita dapat menuliskannya seperti berikut.
// mengatakan kepada kompiler bahwa kita akan menggunakan cout using std: : cout;:||^p^^|jf^|^^^^^H^^ra^^^^BwJHBHllH Dengan menuliskan kode di atas, maka kita tidak perlu lagi menuliskan s t d : : cout untuk melakukan pemanggilan cout.
Bab 19: Namespace
Untuk lebih memperjelas, berikut ini program yang akan memmjukkan konsep dari hal tersebut.
Tampak bahwa setelah kita mendaftarkan cout dengan kata kunci using, maka kita tidak perlu lagi menuliskan std: : cout di dalam program. Adapun contoh lain yang dapat kita ambil untuk menunjukkan konsep dari penggunaan kata kunci using bentuk pertama adalah sebagai berikut.
g std::endl;
amespace NSStack { lass Stack {
private:
int *A;
int atas;
public:
constructor Stack() {
A = new int[10 atas = -1;
' destructor
> t a c k ( delete f ] A ;
/ meletakkan sebuah ni oid push(int nilai)
if (atas == 9) {
cout«" Stack penuh"«endl;
} else {
A[++atas] = nilai;
Pemrograman C+^
// mengambil sebuah nilai dari stack i n t , p o p ( ) {
if (atas < 0) {
cout«"Stack kosong"«endl;
return 0;
} else {
return A[atas--];
I
int main() {
using NSStack::Stack;
Stack ob;
int i ;
// meletakkan nilai ke dalam sta for (i=0; i<10;
ob.push(i+l);
// mengambil nilai dari dalam stack for (i = 0; i<10; i++) {
cout«ob. pop () «endl ;
Hasil yang akan diberikan oleh program di atas adalah sebagai berikut.
10 9 8 7 6 5 4 3
2
1
Dapat kita lihat bahwa pada kode di atas, kita mendeklarasikan objek ob dengan kode berikut.
Bab 19: Namespace
Hal ini dapat dilakukan
SStack::Stack;
yang berarti bahwa kita akan menggunakan kelas Stack yang terdapat di dalam namespace NSStack. Coba Anda perhatikan kembali kode berikut ini yang terdapat pada contoh program di atas.
Jttd;:i;p
Kode tersebut akan mengatakan kepada kompiler bahwa kita akan menggunakan cout dan endl yang terdapat pada namespace std. Sekarang coba Anda bayangkan kembali apabila kita akan menggunakan semua member yang terdapat pada namespace std, apakah kita akan melakukan penulisan kode seperti di atas?
Jawabnya tentu tidak. Di saat seperti inilah kita memerlukan penggunaan kata kunci using bentuk kedua, yaitu dengan cara menuliskan kode berikut:
Melalui kode tersebut, berarti kita sudah dapat menggunakan semua member yang terdapat pada namespace std.