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.
Görev
KolayGetter 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 birPlayersınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:- Özel (private) üyeler:
name(string),level(int) veexperience(int) - Bir isim alan ve
leveldeğerini1,experiencedeğerini0olarak 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). Deneyim100değ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 zaman100 - current experience)
Nesneyi değiştirmedikleri için tüm getter'ları
constolarak işaretleyin.- Özel (private) üyeler:
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
Playeroluşturun "Player: <name>, Level: <level>, XP: <experience>"yazdırınaddExperience()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
- Giriş yapılan isimle bir
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
constolarak işaretlenmelidir - Setter'lar üye değerlerini değiştirdikleri için
constolamazlar - 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;
}
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
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner