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, harici kod bunlara doğrudan erişemez. Getter ve setter'lar, bu private üyelere kontrollü erişim sağlayan public metotlardır; getter'lar değerleri alır, setter'lar ise onları değiştirir.

class Temperature {
    double celsius;    // Özel - 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 uygulayabilirsiniz. Yukarıdaki örnekte, mutlak sıfırın altındaki sıcaklıklar reddedilir. Bir ayarlayıcı (setter) olmadan, herkes doğrudan geçersiz veri atayabilir.

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

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

Getter'lardaki const anahtar kelimesine dikkat edin; bu, nesneyi değiştirmediklerini gösterir. Setter'lar, amaçları üye değerlerini değiştirmek olduğu için const olamazlar. Bu getter ve setter kullanma kalıbı, kapsülleme (encapsulation) için temeldir ve sınıf verilerinize nasıl erişildiği ve değiştirildiği üzerinde size tam kontrol sağlar.

challenge icon

Görev

Kolay

Getter ve setter'ların, doğrulama ve hesaplanmış özellikler dahil olmak üzere özel verilere nasıl kontrollü erişim sağladığını gösteren bir oyuncu profili sistemi oluşturalım.

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

  • Player.h: Korumalı veri erişimine sahip bir oyun karakterinin profilini yöneten bir Player sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • Özel (private) üyeler: name (string), level (int) ve experience (int)
    • Bir isim alan ve level değerini 1, experience değerini 0 olarak başlatan bir yapıcı (constructor)
    • Oyuncunun ismini 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 karakterden oluşan isimleri kabul eden bir setter setName() — geçersizse, mevcut ismi değiştirmeden tutun
    • 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ın ve deneyimden 100 çıkarın. Yeterli deneyim eklenirse bu durum birden fazla kez gerçekleşebilir.
    • Bir sonraki seviyeye ulaşmak için kaç deneyim puanı daha gerektiğini 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şaretleyin.

  • main.cpp: Getter ve setter'larınızı iş başında gösterin. Girişten bir oyuncu adı ve eklenecek deneyim puanlarını okuyun (her biri ayrı bir satırda), ardından:
    • Giriş yapılan isimle bir Player oluşturun
    • "Player: <name>, Level: <level>, XP: <experience>" yazdırın
    • addExperience() kullanarak giriş yapılan deneyim puanlarını ekleyin
    • Güncellenmiş durumu göstermek için aynı durum satırını tekrar yazdırın
    • "XP to next level: <amount>" yazdırın
    • İsmi "Al" olarak değiştirmeyi deneyin (doğrulamadan geçememeli)
    • "Name after invalid change: <name>" yazdırın
    • İsmi "Champion" olarak değiştirin (başarılı olmalı)
    • "Name after valid change: <name>" yazdırın

Deneyim girişi, tam sayıya dönüştürmeniz gereken bir dize (string) olarak sağlanacaktır. Başlık dosyanızı main.cpp içine #include "Player.h" kullanarak dahil edin.

Kopya kağıdı

Getter ve setter'lar, özel (private) sınıf üyelerine kontrollü erişim sağlayan genel (public) metotlardır.

Temel getter ve setter deseni:

class Temperature {
    double celsius;    // Private üye
    
public:
    // Getter - değeri döndürür (const olarak işaretlenir)
    double getCelsius() const {
        return celsius;
    }
    
    // Setter - değeri değiştirir
    void setCelsius(double value) {
        celsius = value;
    }
};

Doğrulama içeren setter'lar:

void setCelsius(double value) {
    if (value >= -273.15) {    // Atama yapmadan önce doğrula
        celsius = value;
    }
}

Hesaplanmış getter'lar:

// Değeri saklamadan hesaplayarak döndürür
double getFahrenheit() const {
    return celsius * 9.0 / 5.0 + 32.0;
}

Önemli noktalar:

  • Getter'lar nesneyi değiştirmedikleri için const olarak işaretlenmelidir
  • Setter'lar üye değerlerini değiştirdikleri için const olamazlar
  • Setter'lar, geçersiz verileri önlemek için doğrulama yapılmasına olanak tanır
  • Getter'lar, değerleri döndürmeden önce dönüştürebilir veya hesaplayabilir

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 isimle bir Player oluştur

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

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

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

    // TODO: "XP to next level: <amount>" yazdır

    // TODO: İsmi "Al" olarak değiştirmeyi dene (doğrulamadan geçmemeli)

    // TODO: "Name after invalid change: <name>" yazdır

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

    // TODO: "Name after valid change: <name>" yazdır

    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