Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class Player yang mengelola profil karakter game dengan akses data yang terlindungi. Class-mu harus memiliki:
    • Anggota privat: name (string), level (int), dan experience (int)
    • Constructor yang menerima nama dan menginisialisasi level dengan 1 dan experience dengan 0
    • 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 melebihi 100, 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 (selalu 100 - current experience)

    Tandai semua getter sebagai const karena getter tersebut tidak mengubah object.

  • 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 Player dengan 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>"

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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online