C++: Mengatasi Circular Reference

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.

Advertisements
This entry was posted in Programming and tagged , , , . Bookmark the permalink.

5 Responses to C++: Mengatasi Circular Reference

  1. Inas Luthfi says:

    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. petra says:

    wow, tumben2an ngepost C++ πŸ˜›

  3. ibn says:

    makasih dewa evan.. (worship) x1000

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s