Menu
Coddy logo textTech

Getter ve Setter Metotları

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 28 / 104.

Sınıf üyeleri private olduğunda, dış kod bunlara doğrudan erişemez. Getter ve setter yöntemleri, bu private üyelere kontrollü erişim sağlayan public yöntemlerdir - getter'lar değerleri alır, setter'lar ise bunları değiştirir.

class Temperature {
    double celsius;    // Private - doğrudan erişilemez
    
public:
    // Getter - değeri döndürür
    double getCelsius() const {
        return celsius;
    }
    
    // Setter - değeri doğrulama ile değiştirir
    void setCelsius(double value) {
        if (value >= -273.15) {    // Mutlak sıfır kontrolü
            celsius = value;
        }
    }
};

Setter'ların gerçek gücü doğrulamadır.

Herhangi bir değerin atanmasına izin vermek yerine kuralları zorunlu kılabilirsiniz. Yukarıdaki örnekte, mutlak sıfırın altındaki sıcaklıklar reddedilir. Bir setter olmadan herkes geçersiz verileri doğrudan atayabilir.

Getter'lar verileri döndürmeden önce de dönüştürebilir:

class Temperature {
    double celsius;
public:
    double getCelsius() const { return celsius; }
    
    // Hesaplanan getter - fahrenheit saklamaz, hesaplar
    double getFahrenheit() const {
        return celsius * 9.0 / 5.0 + 32.0;
    }
    
    void setCelsius(double value) { celsius = value; }
};

Getter'larda const anahtar sözcüğüne dikkat edin - bu, nesneyi değiştirmediklerini gösterir. Setter'lar const olamaz; çünkü amaçları üye değerlerini değiştirmektir. Getter ve setter kullanma biçimi, kapsüllemenin temelini oluşturur ve sınıf verilerinize nasıl erişileceği ve bunların nasıl değiştirileceği üzerinde tam kontrol sahibi olmanızı sağlar.

challenge icon

Görev

Kolay

Doğrulama ve hesaplanan özellikler de dâhil olmak üzere, getter ve setter'ların özel verilere kontrollü erişim sağlamasını gösteren bir oyuncu profili sistemi oluşturalım.

Kodunu düzenlemek için iki dosya oluşturacaksın:

  • Player.h: Korumalı veri erişimiyle bir oyun karakterinin profilini yöneten bir Player sınıfı tanımla. Sınıfın şunlara sahip olmalı:
    • Özel üyeler: name (string), level (int) ve experience (int)
    • Bir ad alan ve level değerini 1, experience değerini 0 olarak başlatan bir kurucu
    • Oyuncunun adını döndüren bir getter: getName()
    • Mevcut seviyeyi döndüren bir getter: getLevel()
    • Mevcut deneyim puanlarını döndüren bir getter: getExperience()
    • Yalnızca en az 3 karakterli adları kabul eden bir setter: setName(); ad geçersizse mevcut adı değiştirmeden koru
    • Yalnızca pozitif değerleri kabul eden bir setter: addExperience(int points). Deneyim 100 değerine ulaştığında veya bu değeri aştığında oyuncu seviye atlar: seviyeyi 1 artır ve deneyimden 100 çıkar. Yeterli deneyim eklenirse bu işlem birden çok kez gerçekleşebilir.
    • Bir sonraki seviyeye ulaşmak için kaç deneyim puanına daha ihtiyaç olduğunu döndüren hesaplanmış bir getter: getExperienceToNextLevel() (her zaman 100 - current experience)

    Nesneyi değiştirmedikleri için tüm getter'ları const olarak işaretle.

  • main.cpp: Getter ve setter'larını çalışırken göster. Girdiden bir oyuncu adı ve eklenecek deneyim puanlarını oku (her biri ayrı bir satırda), ardından:
    • Girdi adıyla bir Player oluştur
    • "Player: <name>, Level: <level>, XP: <experience>" yazdır
    • Girdi olarak alınan deneyim puanlarını addExperience() kullanarak ekle
    • Güncellenmiş durumu göstermek için aynı durum satırını tekrar yazdır
    • "XP to next level: <amount>" yazdır
    • Adı "Al" olarak değiştirmeyi dene (doğrulama başarısız olmalı)
    • "Name after invalid change: <name>" yazdır
    • Adı "Champion" olarak değiştir (başarılı olmalı)
    • "Name after valid change: <name>" yazdır

Deneyim girdisi, tamsayıya dönüştürmen gereken bir dize olarak sağlanacak. Başlık dosyanı #include "Player.h" kullanarak main.cpp dosyasına ekle.

Kendin dene

#include <iostream>
#include <string>
#include "Player.h"

using namespace std;

int main() {
    // Oyuncu adını oku
    string playerName;
    getline(cin, playerName);

    // Eklenecek deneyim puanlarını oku (string olarak, int'e dönüştür)
    string expString;
    getline(cin, expString);
    int expToAdd = stoi(expString);

    // TODO: Girilen adla bir Player oluştur

    // TODO: Başlangıç durumunu yazdır: "Player: <name>, Level: <level>, XP: <experience>"

    // TODO: Girilen deneyim puanlarını addExperience() kullanarak ekle

    // TODO: Güncellenmiş durum satırını yazdır

    // TODO: Print "XP to next level: <amount>"

    // TODO: Adı "Al" olarak değiştirmeyi dene (doğrulama başarısız olmalı)

    // TODO: Print "Name after invalid change: <name>"

    // TODO: Adı "Champion" olarak değiştir (başarılı olmalı)

    // TODO: Print "Name after valid change: <name>"

    return 0;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Online C++ derleyicisi