pertemuan 14 : class part 2 & 3 · fungsi yang harus dinamakan sama dengan nama class-nya. agar...
Post on 15-Nov-2020
3 Views
Preview:
TRANSCRIPT
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
top related