Pertemuan 14 : Class Part 2 & 3 · Fungsi yang harus dinamakan sama dengan nama class-nya. Agar...

Preview:

Citation preview

Reference : Deitel, P. & Deitel, H. (2014). C++ How to Program 9th Edition. Massachusetts: Prentice Hall.

Game Technology Design Major College of Multi Media Yogyakarta Spring 2016/2017 Tri Anggraeni, S.Kom., M.Sc.

Pertemuan 14 : Class Part 2 & 3

Review Materi Pertemuan 12 & 13

• Class terdiri atas ……. & …… – Data members & member functions

• Setiap kelas tidak bisa menjadi tipe data baru.

Benar/salah? – Salah

• GradeBook myGradeBook; – GradeBook merupakan tipe data. B / S ? – myGradeBook bukan merupakan variabel. B / S ?

B S

• myGradeBook.displayMessage(); Artinya : a. myGradeBook merupakan fungsi. B / S ? b. displayMessage merupakan variabel. B / S ?

c. Fungsi myGradeBook memanggil variabel

displayMessage. B / S ?

S S S

Class di Pertemuan 12 & 13

1. Membuat class dengan 1 fungsi 2. Membuat fungsi dengan sebuah parameter 3. Data members, set functions, & get functions

Class Part 2 (Pertemuan ini)

4. Menginisialisasikan objects dengan constructors 5. Meletakkan class pada file lain untuk reusability

Constructor

Fungsi yang harus dinamakan sama dengan nama class-nya.

Agar compiler dapat membedakannya dari fungsi-fungsi lain yang ada pada sebuah class. Merupakan fungsi yang digunakan untuk

konfirmasi, apakah nama object yang dibuat dari class sudah sama dengan nama constructornya.

Jika sama berarti benar.

Constructor

• Dipanggil oleh C++ setiap kali object dibuat. • Dapat digunakan juga untuk menginisialisasi object

dari suatu class ketika object itu dibuat. • Tidak dapat menghasilkan suatu nilai. Tidak boleh menggunakan return type.

• Dideklarasikan dalam public

Pertemuan 12 & 13

Program ke-1 : Cuma menampilkan pesan "Welcome to the Grade Book!"

Program ke-2 : Menampilkan “Grade book2 for " + nama mata kuliah yang merupakan masukan user

Program ke-3 : Menampilkan “Grade book2 for " + nama mata

kuliah yang merupakan masukan user, tapi pake set & get function & 1 data member

Program ke-4 : Menampilkan “Grade book2 for " + nama & kode mata kuliah yang merupakan masukan user, pake set & get function & 2 data member

Program hari ini : Menampilkan nama mata kuliah dengan

constructor (nama mt kul diset ketika objek dibuat)

/* GradeBook4.cpp : Membuat constructor & menggunakannya utk

menentukan course name ketika object GradeBook4 dibuat */

#include <iostream> #include <string> using namespace std; class GradeBook4 {

private: string courseName; // data member

public: GradeBook4 ( string name ) { // constructor dgn 1 argument

/* Constructor tidak boleh menggunakan tipe return. Karena tidak boleh menghasilkan nilai */

setCourseName ( name ); /* memanggil fungsi set & menginisialisasi courseName dengan string yang diambil dari argumen constructor */

} // fungsi untuk mengeset course name : void setCourseName ( string name) { courseName = name; /* memberikan nilai parameter name kepada data member courseName */ } // end setCourseName function

Nama constructor sama dengan nama class Parameter GradeBook4 gradeBook1 ( “2F ALP Algoritma” );

// function to get the course name : string getCourseName () { return courseName; } // end function getCourseName }; // end class GradeBook4

int main () { /* membuat 2 object GradeBook4 & menentukan course name untuk object GradeBook4 ketika object itu dibuat : */ GradeBook4 gradeBook1 ( “2F ALP Algoritma” ); GradeBook4 gradeBook2 ( “2F EDG Edu Game” );

/* “2F ALP Algoritma” merupakan argumen yg diteruskan ke constructor object GradeBook4 untuk menginisialisasi course name gradeBook1 */

/* menampilkan courseName untuk setiap GradeBook4 */ cout << “Book 1 : ”

<< gradeBook1.getCourseName() << endl << “Book 2 : ” << gradeBook2.getCourseName() << endl << endl; }

Memanggil constructor GradeBook4

Hasil

Let’s trace from the main Click

Constructor

Jika class tidak mendefinisikan constructor (seperti pada program2 di Pertemuan 12 & 13) : Compiler menyediakan default constructor (constructor

yang tidak memiliki parameter).

Ketika object GradeBook3 dibuat pada fungsi main : GradeBook myGradeBook;

Compiler memanggil default constructor yang dimilikinya.

Di GradeBook4.cpp ada constructor Di Class_Set_Get.cpp TIDAK ADA constructor

• Apa sih constructor? F.......... Fungsi Digunakan untuk :

• Menginisialisasikan object dari suatu class ketika object itu dibuat.

• Memastikan setiap object diinisialisasikan dengan tepat sebelum digunakan pada program.

Jadi apa perbedaan antara Class_Set_Get.cpp & GradeBook4.cpp ??

Meletakkan class pada file lain untuk reusability

• Kelebihan class : dapat di-reuse (digunakan) oleh programmer lain.

• Contoh : penggunaan standard library C++ menggunakan header <string>.

Meletakkan class pada file lain untuk reusability

• Buat folder baru dengan nama Nyoba Reusability.

• Di DevC++, buat file baru. Copas class GradeBook4 di file itu (tanpa fungsi main). Simpan di folder Nyoba Reusability, dengan nama GradeBook, pilih File Type Header Files agar menjadi GradeBook.h dan GradeBook.h menjadi Header files (.h).

• Buat file baru. Copas fungsi main di GradeBook4.cpp. Simpan dengan nama GradeMain.cpp. Lengkapi include-include & using namespacenya. Tambahkan : #include "GradeBook.h“

• Jalankan program

GradeBook.h

• BUKAN program yang utuh karena tidak memiliki fungsi main.

• HARUS berada di folder/project yang sama dengan file main yang memanggilnya.

include <string> Jika diapit tanda <> : header merupakan C++

Standard Library. include “Grade.h” Jika diapit tanda “” : header BUKAN merupakan C++

Standard Library & berada di direktori program yang sedang diproses.

3. Memisahkan interface dari implementasi 4. Memvalidasi data dengan fungsi set

Class di Pertemuan 12 & 13 1. Membuat class dengan 1 fungsi √ 2. Membuat fungsi dengan sebuah parameter √ 3. Data members, set functions, & get functions √

Class Part 2 (Pertemuan ini) 1. Menginisialisasikan objects dengan constructors √ 2. Meletakkan class pada file lain untuk reusability √

• Program sebelumnya : – GradeBook.h berisi definisi class – GradeMain.cpp berisi fungsi main disebut client

code.

• Program sebelumnya : memisahkan definisi class dari client code.

• Interface : mendefinisikan & menstandarkan seperti orang berinteraksi dengan sistem/layanan sistem.

Memisahkan interface dari implementasi

• Interface class : – Menggambarkan service-service/hal-hal yang

dapat digunakan oleh class’s client & bagaimana memanggil service-service itu tapi TIDAK MENGGAMBARKAN bagaimana class melakukan services.

• Pada contoh pertemuan sebelumnya : – Interface class : GradeBook.h – Class’s client : Grade_Main.cpp

Pada software engineering : Fungsi lebih baik dibuat di luar class definition sehingga implementation details (detail isi)-nya dapat di-hidden dari client code. Untuk memastikan bahwa client code tidak

bergantung pada implementation details suatu kelas.

Karena 1 class dapat memiliki banyak client code Perubahan pada implementation (isi) class dapat

menyebabkan masalah yang besar pada suatu software.

Memisahkan interface dari implementasi

Interface class public : berisi fungsi2 public (public services). GradeBook.h : berisi constructor & fungsi2

setCourseName, getCourseName, & displayMessage.

• Class’s client : Grade_Main.cpp : menggunakan fungsi2 GradeBook.h untuk memanggil class’s services.

• Program sebelumnya : Setiap class definition berisi definisi lengkap fungsi-fungsi public & deklarasi data members class itu.

Contoh Pemisahan Interface dari Implementasi

GradeBook.h contoh sebelumnya : Pecah menjadi 2 : 1. Pada DevC++, buat new project dari menu File, Project,

Console Application.

2. Simpan new file yang terbuka dengan nama GradeBook.cpp di folder baru yang bernama “14.2 Memisahkan interface dari implementasi”.

3. Buat file baru (Ctrl + N) atau dari Menu File > New > Source file. Klik Yes pada :

Ketik program GradeBook.h yang baru berikut : /* GradeBook.h : GradeBook class definition Public interface GradeBook yang tidak

memperlihatkan implementasi (isi) dari fungsi2nya */

#include <string> // class GradeBook uses C++ standard string class using namespace std; class GradeBook { public: GradeBook( string ); void setCourseName( string ); string getCourseName(); void displayMessage(); private: string courseName; };

Function prototypes (deklarasi fungsi yang berisi : nama fungsi,

tipe return/hasilnya, & tipe parameternya).

Sama seperti header fungsi pada contoh pertemuan sebelumnya, tetapi diakhiri tanda titik koma

Menunjukkan bahwa constructor membutuhkan

1 parameter string

Tidak menyebut nama parameter : krn di-ignore oleh compiler. Tapi boleh disebutkan untuk dokumentasi program.

/* GradeBook.cpp (Berisi definisi fungsi-fungsi GradeBook, implementations (isi) dari fungsi2 yg dibentuk di GradeBook.h) */

#include <iostream> #include “GradeBook.h” using namespace std; // constructor : GradeBook::GradeBook( string name ) { setCourseName( name ); } /* Tanpa GradeBook:: fungsi tidak akan dikenali sebagai fungsi

class GradeBook, akan dianggap sebagai fungsi yang bebas seperti main, disebut juga fungsi global */

Binary scope resolution operator (mengikat setiap fungsi pada class GradeBook yang berada di file lain)

Kembali ke file GradeBook.cpp, ketik program berikut :

// fungsi untuk mengeset course name void GradeBook::setCourseName ( string name ) { courseName = name; } // fungsi untuk memperoleh course name string GradeBook::getCourseName() { return courseName; } // mendisplay pesan selamat datang void GradeBook::displayMessage() { cout << "Welcome to Grade Book for : " << getCourseName() << endl << endl; }

• Jika fungsi setCourseName & getCourseName hanya ditulis :

void setCourseName ( string name ) { courseName = name; } string getCourseName() { return courseName; }

Error : karena courseName tidak dideklarasikan sebagai variabel lokal pada tiap fungsi. Compiler tidak akan tahu kalau courseName sudah dideklarasikan sebagai data member class GradeBook.

• Nama parameter pada function prototype harus sama dengan yang ada pada function definition.

• Jika tidak error.

Biasanya programmer membuat function definition dulu, meng-copy baris awalnya, dan menambahkan tanda titik koma pada setiap akhir prototype.

• File .cpp yang berisi definisi fungsi-fungsi diberi nama yang sama dengan nama header class.

/* Grade_Main.cpp (GradeBook class demonstration after separating its interface from its implementation) */ #include <iostream> #include "GradeBook.h" using namespace std; int main() { // membuat 2 object GradeBook GradeBook gradeBook1( "2F ALP Algoritma" ); GradeBook gradeBook2( "2F EDG Edu Game" ); /* menampilkan courseName untuk setiap GradeBook */ cout << "Book 1 : " << gradeBook1.getCourseName() << "\nBook 2 : " << gradeBook2.getCourseName() << endl << endl; system("pause"); }

• Compile GradeBook.h • Compile GradeBook.cpp

Ketika meng-compile GradeBook.cpp : Compiler menggunakan informasi padaGradeBook.h untuk memastikan bahwa : 1. Baris awal setiap fungsi persis sama dengan prototype yang ada

pada file GradeBook.h 2. Setiap fungsi mengetahui data member & fungsi2 lain pada

class. Sehingga : a. Fungsi setCourseName & getCourseName dapat mengakses

variabel courseName yang dideklarasikan pada GradeBook.h sebagai data member class GradeBook.

b. Constructor GradeBook dapat memanggil fungsi setCourseName & getCourseName karena fungsi2 itu dideklarasikan sebagai fungsi pada GradeBook.h & karena fungsi2 itu sesuai dengan prototype.

Client code programmer hanya perlu tau GradeBook interface (GradeBook.h), tidak perlu tau GradeBook.cpp, tapi harus bisa menghubungkan object code-nya.

Compilation & Linking Process

Client code programmer dapat langsung menggunakan tanpa perlu mengetahui isi detailnya

Validasi Data dengan Fungsi set Buat project baru dan interface GradeBook.h berikut : /* GradeBook.h : GradeBook class definition Public interface GradeBook yang tidak

memperlihatkan implementasi (isi) dari fungsi2nya */

#include <string> // class GradeBook uses C++ standard string class using namespace std;

class GradeBook { public: GradeBook( string ); void setCourseName( string ); string getCourseName(); void displayMessage(); private: string courseName; };

Sama persis seperti GradeBook.h pada

contoh sebelumnya. Yang dimodifikasi adalah

isi fungsi set

Simpan di folder baru yang bernama “14.3 Validasi Data dengan Fungsi set”

/* GradeBook.cpp (Isi dari GradeBook member-function definitions. Fungsi setCourseName melakukan validasi */ #include <iostream> #include "GradeBook.h" // include definisi class GradeBook using namespace std; // constructor yang menginisialisasi courseName GradeBook::GradeBook( string name ) { // memvalidasi & menyimpan courseName setCourseName( name ); }

// fungsi yang mengeset course name // memastikan bahwa course name maksimal 25 karakter void GradeBook::setCourseName( string name ) { // if name memiliki 25 / lebih sedikit karakter : if ( name.length() <= 25 ) { // menyimpan course name pada object courseName = name; // if name lebih dari 25 karakter : } else if ( name.length() > 25 ) { // set courseName hanya 25 karakter awal courseName = name.substr( 0, 25 ); // mulai dari krkter ke-0, sepanjang 25 krkter

cout << "Nama \"" << name << "\" \nmelebihi panjang maksimal 25 karakter.\n" << "Sistem ini membatasi nama mt kul hanya 25 karakter.\n" << endl; } // end if } // fungsi untuk memperoleh course name string GradeBook::getCourseName() { return courseName; // return object's courseName } // end function getCourseName

// menampilkan welcome message to the GradeBook user void GradeBook::displayMessage() { /* memanggil fungsi getCourseName untuk memperoleh courseName */ cout << "Welcome to the grade book for\n" << getCourseName() << "!" << endl; } // end function displayMessage

/* Grade_Main.cpp ( Membuat & memanipulasi object GradeBook; contoh validasi */ #include <iostream> #include "GradeBook.h" // include definition of class GradeBook using namespace std; // function main begins program execution int main() { // create two GradeBook objects // initial course name of gradeBook1 is too long GradeBook gradeBook1( "CS101 Introduction to Programming in C++" );

GradeBook gradeBook2( "CS102 C++ Data Structures" );

// display each GradeBook's courseName cout << "Grade Book 1 : " << gradeBook1.getCourseName() << "\nGrade Book 2 : " << gradeBook2.getCourseName() << endl; // modify myGradeBook's courseName (with a valid-length string)

gradeBook1.setCourseName( "CS101 C++ Programming" ); // display each GradeBook's courseName cout << "\nGrade Book 1 modified : " << gradeBook1.getCourseName() << endl << endl; system("pause"); } // end main

Alternatif hasil

• Fungsi set harus dibuat dengan teliti jika diinginkan untuk mengubah nilai data member. Nilai yang baru harus tepat untuk jenis datanya. Contoh :

a. Permintaan untuk mengeset jumlah hari dalam 1 bulan untuk lebih dari 31 hari tidak boleh dilakukan.

b. Permintaan untuk mengeset berat badan menjadi 0 (nol) atau negatif tidak boleh dilakukan.

Matikan komputer, monitor, mouse

Pelajari lagi

Recommended