C++: Mengatasi Circular Reference
Februari 5, 2010 at 3:49 pm 5 komentar
Sekarang saya sedang mengeksplor kembali c++, ternyata ada masalah-masalah baru yang belum pernah saya ketahui sebelumnya. Maklum, sebelum ini cuma sempat mempelajari c++ di kuliah OOP dan saat Kerja Praktik.
Masalah yang saya bahas kali ini adalah circular reference. Misalkan ada satu file header a.h menginclude b.h, dan b.h menginclude a.h, maka terjadilah circular reference. Cara mengatasinya ada 2 tahap: memakai include guard dan forward declaration.
Include guard merupakan trik untuk mencegah sebuah file terinclude 2 kali, umumnya selalu dipakai pada semua file header (dan sejak kuliah Struktur data sudah diwajibkan untuk dipakai). Include guard dapat dituliskan seperti ini
#ifndef __HEADER_A_H
#define __HEADER_A_H
#include "b.h"
class A {
void do(B b);
}
#endif
Di mana __HEADER_A_H merupakan sebuah label untuk file header tersebut, yang harus unik untuk setiap file header. Dengan include guard ini, kita dapat menghindari error kompilasi karena compiler melakukan looping untuk menginclude file a.h dan b.h tanpa henti.
Namun cara ini belum cukup untuk mengatasi masalah circular reference. Misalkan kita coba mengkompilasi dua buah file sbb:
//----- a.h ------//
#ifndef __HEADER_A_H
#define __HEADER_A_H
#include "b.h"
class A {
void do(B b);
}
#endif
//----- b.h ------//
#ifndef __HEADER_B_H
#define __HEADER_B_H
#include "a.h"
class B {
void do(A a);
}
#endif
Akan terjadi error kompilasi karena salah satu class tidak akan terdefinisi pada class satunya (karena file yang diinclude tidak akan diinclude lagi). Untuk mengatasinya kita memakai teknik forward declaration untuk menggantikan perintah include.
//----- a.h ------//
#ifndef __HEADER_A_H
#define __HEADER_A_H
class B; //forward declaration class B
class A {
void do(B b);
}
#endif
//----- b.h ------//
#ifndef __HEADER_B_H
#define __HEADER_B_H
class A; //forward declaration class A
class B {
void do(A a);
}
#endif
Dengan forward declaration, kita cukup memberitahu bahwa kita memakai sebuah class tanpa perlu menginclude file yang berisi deklarasi class tersebut. Nantinya pada file implementasi (.cpp) kita baru menginclude file class yang bersangkutan. Namun perlu diingat, karena compiler tidak mengetahui isi dari class tersebut, kita tidak dapat langsung mengakses member class dari file header, jadi akses member harus dilakukan di file .cpp.
Entry filed under: Programming. Tags: c++, header, include, Programming.
5 Komentar Add your own
Tinggalkan Balasan
Trackback this post | Subscribe to the comments via RSS Feed
1.
Inas Luthfi | Februari 5, 2010 pada 4:03 pm
Wah C++ sudah lama juga saya ndak menyentuhnya.
Ada buku dari Scott Meyer yang merekomendasikan teknik ini juga van, bahkan ada banyak tips yang lain juga. Ini bukunya, http://www.amazon.com/Effective-Specific-Improve-Programs-Designs/dp/0321334876/ref=sr_1_1?ie=UTF8&s=books&qid=1265360589&sr=8-1
2.
evangozali | Februari 5, 2010 pada 4:05 pm
Wah buku sudah lama juga saya ndak menyentuhnya
Nyari referensi dari om google terus.
3.
petra | Februari 5, 2010 pada 4:06 pm
wow, tumben2an ngepost C++
4.
ibn | Februari 5, 2010 pada 4:27 pm
makasih dewa evan.. (worship) x1000
5.
evangozali | Februari 5, 2010 pada 4:33 pm
ada dewa ibnu alam (worship)x10000