Dalam C++ untuk pembuatan kelas dibagi menjadi dua, yakni header dan implementasi. Misalnya kita memiliki kelas-kelas sebagai berikut:
Kendaraan
Mobil
Motor
Berarti kita akan membuat 6 file seperti ini:
Kendaraan.h
Kendaraan.cpp
Mobil.h
Mobil.cpp
Motor.h
Motor.cpp
Misalkan Motor dan Mobil masing-masing inherit Kendaraan. Berarti kedua kelas tersebut harus di "include" ke file Mobil dan Motor kan? Nah disini masalahnya
Case Study
Dimisalkan kita memiliki kelas Kendaraan sebagai berikut
Kendaraan.h
//Kendaraan.h class Kendaraan{ private: int kecepatan; public: Kendaraan(); ~Kendaraan(); void setKecepatan(int kecepatan); int getKecepatan(); };
Kendaraan.cpp
Kendaraan::Kendaraan(){ } Kendaraan::~Kendaraan(){ } void Kendaraan::setKecepatan(int kecepatan){ this->kecepatan = kecepatan; } int Kendaraan::getKecepatan(){ return this->kecepatan; }
Dan kelas anaknya adalah sebagai berikut
Motor.h
//Motor.h #include "Kendaraan.h" class Motor:public Kendaraan{ private: public: Motor(); ~Motor(); };
Motor.cpp
#include "Motor.h" Motor::Motor(){ } Motor::~Motor(){ }
Mobil.h
//Mobil.h #include "Kendaraan.h" class Mobil:public Kendaraan{ private: public: Mobil(); ~Mobil(); };
Mobil.cpp
#include "Mobil.h" Mobil::Mobil(){ } Mobil::~Mobil(){ }Dan program main nya seperti ini Main.cpp
#include <iostream> #include "Motor.h" #include "Mobil.h" using namespace std; int main(string args[]){ Motor motor; Mobil mobil; return 0; }
Ketika di compile, yang terjadi adalah error seperti ini
In file included from Mobil.h:1, from Main.cpp:4: Kendaraan.h:2: error: redefinition of ‘class Kendaraan’ Kendaraan.h:2: error: previous definition of ‘class Kendaraan’
"redefinition of class"! Berarti kita mendefinisikan kelas lebih dari sekali. Ya, soalnya kita sudah mendefiniskan kelas Kendaraan di Motor (dengan #include "Kendaraan.h") kemudian di-include lagi di Mobil, walhasil jadinya dua kali include.
Nah karena itulah kita memerlukan Header guard.
Header Guard
Header guard, atau Include Guard merupakan directives, yaitu perintah yang diawali # dan diakhiri dengan baris baru.Nah, kita bisa membuat Header Guard dengan memberikan directive berikut di awal tiap header
#ifndef KENDARAAN_H #define KENDARAAN_H //Kendaraan.h class Kendaraan{ private: int kecepatan; public: Kendaraan(); ~Kendaraan(); void setKecepatan(int kecepatan); int getKecepatan(); }; #endif
directive yang kita tulis menyatakan jika belum didefinisikan (#ifndef) maka definisikan (#define) kelas kita. Jangan lupa beri #endif di akhir
beri header guard ini di setiap header kelas yang kamu buat. Dengan pemberian header guard ini kalau kamu #include kelas lebih dari sekali nggak ada lagi issue redefinition of class
referensi:
http://www.learncpp.com/cpp-tutorial/110-a-first-look-at-the-preprocessor/
http://en.wikipedia.org/wiki/Include_guard
http://en.wikipedia.org/wiki/Header_file