Getter dan setter
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 28 dari 104.
Ketika member class bersifat privat, kode eksternal tidak dapat mengaksesnya secara langsung. Getter dan setter adalah method publik yang menyediakan akses terkontrol ke member privat ini, getter mengambil nilai, sedangkan setter mengubahnya.
class Temperature {
double celsius; // Privat, tidak bisa diakses langsung
public:
// Getter, mengembalikan nilai
double getCelsius() const {
return celsius;
}
// Setter, mengubah nilai dengan validasi
void setCelsius(double value) {
if (value >= -273.15) { // Pemeriksaan nol mutlak
celsius = value;
}
}
};Kegunaan utama setter adalah validasi.
Alih-alih membiarkan nilai apa pun ditetapkan, kamu bisa menerapkan aturan. Dalam contoh di atas, suhu di bawah nol mutlak ditolak. Tanpa setter, siapa pun bisa menetapkan data yang tidak valid secara langsung.
Getter juga dapat mengubah data sebelum mengembalikannya:
class Temperature {
double celsius;
public:
double getCelsius() const { return celsius; }
// Getter yang dihitung: tidak menyimpan nilai fahrenheit, tetapi menghitungnya
double getFahrenheit() const {
return celsius * 9.0 / 5.0 + 32.0;
}
void setCelsius(double value) { celsius = value; }
};Perhatikan kata kunci const pada getter. Ini menunjukkan bahwa getter tidak mengubah object. Setter tidak dapat menggunakan const karena tujuannya adalah mengubah nilai anggota. Pola penggunaan getter dan setter ini merupakan dasar enkapsulasi, sehingga kamu memiliki kendali penuh atas cara data class-mu diakses dan diubah.
Tantangan
MudahMari buat sistem profil pemain yang menunjukkan cara getter dan setter menyediakan akses terkontrol ke data privat, termasuk validasi dan property hasil perhitungan.
Kamu akan membuat dua file untuk mengatur kodemu:
Player.h: Definisikan classPlayeryang mengelola profil karakter game dengan akses data yang terlindungi. Class-mu harus memiliki:- Anggota privat:
name(string),level(int), danexperience(int) - Constructor yang menerima nama dan menginisialisasi
leveldengan1danexperiencedengan0 - Getter
getName()yang mengembalikan nama pemain - Getter
getLevel()yang mengembalikan level saat ini - Getter
getExperience()yang mengembalikan poin experience saat ini - Setter
setName()yang hanya menerima nama dengan sedikitnya 3 karakter. Jika nama tidak valid, pertahankan nama saat ini - Setter
addExperience(int points)yang hanya menerima nilai positif. Saat experience mencapai atau melebihi100, level pemain naik: tingkatkan level sebanyak 1 dan kurangi experience sebesar 100. Hal ini dapat terjadi beberapa kali jika experience yang ditambahkan cukup. - Getter hasil perhitungan
getExperienceToNextLevel()yang mengembalikan jumlah poin experience tambahan yang dibutuhkan untuk mencapai level berikutnya (selalu100 - current experience)
Tandai semua getter sebagai
constkarena getter tersebut tidak mengubah object.- Anggota privat:
main.cpp: Tunjukkan cara kerja getter dan setter. Baca nama pemain dan poin experience yang akan ditambahkan dari input (masing-masing pada baris terpisah), lalu:- Buat
Playerdengan nama dari input - Cetak
"Player: <name>, Level: <level>, XP: <experience>" - Tambahkan poin experience dari input menggunakan
addExperience() - Cetak baris status yang sama lagi untuk menunjukkan keadaan terbaru
- Cetak
"XP to next level: <amount>" - Coba ubah nama menjadi
"Al"(validasi seharusnya gagal) - Cetak
"Name after invalid change: <name>" - Ubah nama menjadi
"Champion"(seharusnya berhasil) - Cetak
"Name after valid change: <name>"
- Buat
Input experience akan diberikan sebagai string yang perlu kamu ubah menjadi integer. Sertakan file header-mu di main.cpp menggunakan #include "Player.h".
Coba sendiri
#include <iostream>
#include <string>
#include "Player.h"
using namespace std;
int main() {
// Baca nama pemain
string playerName;
getline(cin, playerName);
// Baca poin pengalaman yang akan ditambahkan (sebagai string, lalu konversi ke int)
string expString;
getline(cin, expString);
int expToAdd = stoi(expString);
// TODO: Buat Player dengan nama dari input
// TODO: Cetak status awal: "Player: <name>, Level: <level>, XP: <experience>"
// TODO: Tambahkan poin pengalaman dari input menggunakan addExperience()
// TODO: Cetak baris status yang sudah diperbarui
// TODO: Cetak "XP to next level: <amount>"
// TODO: Coba ubah nama menjadi "Al" (validasi seharusnya gagal)
// TODO: Cetak "Name after invalid change: <name>"
// TODO: Ubah nama menjadi "Champion" (seharusnya berhasil)
// TODO: Cetak "Name after valid change: <name>"
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online