Cpp Example: OOP Circle Class

Agar terlihat rapi, disarankan untuk memisahkan antara deklarasi class dan implementasinya. deklarasi dibuat di header file (*.h) sedangkan implementasi di buat di cpp file (*.cpp). dengan demikian header file bisa dipublikasikan sedangkan implementasi bisa dicontrol oleh programmer, atau hanya menyediakan  object file “.o” library untuk end user.

Circle Class

Memiliki 3 file:

1. Circle.h

2.Circle.cpp

3.TestCircle.cpp

Circle.h

/* The Circle class Header (Circle.h) */
#include <string>   // using string
using namespace std;
 
// Circle class declaration
class Circle {
private:   // Accessible by members of this class only
   // private data members (variables)
   double radius;
   string color;
 
public:    // Accessible by ALL
   // Declare prototype of member functions
   // Constructor with default values
   Circle(double radius = 1.0, string color = "red");
 
   // Public getters & setters for private data members
   double getRadius() const;
   void setRadius(double radius);
   string getColor() const;
   void setColor(string color);
 
   // Public member Function
   double getArea() const;
};

Keterangan:

Header file berisi deklarasi, yang memberitahu compiler tentang nama dan type, function prototype tanpa detail implementasi.

C++98/03 tidak mengijinkan kita menginitial value dari data member, kecuali const static members. misal:

double radius = 1.0;

maka akan menghasilkan error:

Circle.h [Warning] non-static data member initializers only available with -std=c++11 or -std=gnu++11

Untuk C++11 kita diijinkan untuk menginitialisasi data member.

Kita dapat menyediakan default value argument function melalui constructor

Circle(double radius = 1.0, string color = "red");

Header berisi function prototype, nama parameter akan diabaikan oleh compiler, tetapi  baik untuk dokumentasi

Circle.cpp

/* The Circle class Implementation (Circle.cpp) */
#include "Circle.h" // user-defined header in the same directory
 
// Constructor
// default values shall only be specified in the declaration,
// cannot be repeated in definition
Circle::Circle(double r, string c) {
   radius = r;
   color = c;
}
 
// Public getter for private data member radius
double Circle::getRadius() const {
   return radius;
}
 
// Public setter for private data member radius
void Circle::setRadius(double r) {
   radius = r;
}
 
// Public getter for private data member color
string Circle::getColor() const {
   return color;
}
 
// Public setter for private data member color
void Circle::setColor(string c) {
   color = c;
}
 
// A public member function
double Circle::getArea() const {
   return radius*radius*3.14159265;
}

Keterangan:

Implementation file berisi function definition, berdasarkan function declaration di header file

#include “Circle.h”, ini harus disertakan, dengan “” (double quotes) bukan <> , karena “” compiler akan mencari file di current direktory, sedangkan <> akan mencari di system.

Circle::Circle(double r, string c) {

kita harus menginclude className:: (called class scope resolution operator) , Circle::, didepan semua nama member, sehingga compiler mengetahui bahwa nama member tersebut merupakan milik dari nama class.

Default parameter harus diletakkan di header file, bukan diimplementation file. Jika kita letakan di implementation file akan error seperti ini:

devccpp\main.cpp [Error] no matching function for call to 'Circle::Circle()'

Compiling the circle Class

Kita bisa mengcompile Circle.cpp menjadi object file, dengan nama Circle.o dengan GNU GCC;

> g++ -c Circle.cpp
// option –c for compile-only, output is Circle.o

Untuk menggunakan Circle class, kita membutuhkan Circle.h dan Circle.o, jadi kita bisa menyimpan Circle.cpp.

TestCircle.cpp

/* A test driver for the Circle class (TestCircle.cpp) */
#include <iostream>
#include "Circle.h"   // using Circle class
using namespace std;
 
int main() {
   // Construct an instance of Circle c1
   Circle c1(1.2, "red");
   cout << "Radius=" << c1.getRadius() << " Area=" << c1.getArea()
        << " Color=" << c1.getColor() << endl;
 
   c1.setRadius(2.1);   // Change radius and color of c1
   c1.setColor("blue");
   cout << "Radius=" << c1.getRadius() << " Area=" << c1.getArea()
        << " Color=" << c1.getColor() << endl;
 
   // Construct another instance using the default constructor
   Circle c2;
   cout << "Radius=" << c2.getRadius() << " Area=" << c2.getArea()
        << " Color=" << c2.getColor()  << endl;
   return 0;
}

Compile the Test Program

Untuk mengcompile TestCircle.cpp dengan object Circle.o (dan Circle.h)

> g++ -o TestCircle.exe TestCircle.cpp Circle.o
// option -o specifies the output filename

Kita juga bisa mengcompile TestCircle.cpp dengan source code Circle.cpp (and Circle.h)

g++ -o TestCircle.exe TestCircle.cpp Circle.cpp

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *