Saturday, September 28, 2013

C++: Header Guard

Pas praktikum PBO dan lagi pakai C++ ada praktikan yang pake #include dan error. Katanya ada kelas yang redeclare! Ooh dan ternyata harus pakai Header Guard supaya nggak error.

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

No comments:

Post a Comment

Comment is caring :)