Menu
Coddy logo textTech

Örnek ve Statik Üyeler

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

Şimdiye kadar oluşturduğun her üye değişken belirli bir nesneye aitti. İki Player nesnesi oluşturduğunda, her birinin kendine ait bir name ve health değeri olur. Bunlara örnek üyeleri denir - sınıfın her örneği için ayrı ayrı var olurlar.

Peki ya tüm nesneler arasında paylaşılan verilere ihtiyacın varsa? Örneğin, toplamda kaç oyuncunun bulunduğunu takip etmek.

statik üyeler işte burada devreye girer. Statik bir üye, belirli bir nesneye değil, sınıfın kendisine aittir.

class Player {
    std::string name;           // Örnek üye - her oyuncunun kendine ait
    int health;                 // Örnek üye
    
    static int playerCount;     // Statik üye - TÜM oyuncular tarafından paylaşılır
    
public:
    Player(std::string n) : name(n), health(100) {
        playerCount++;          // Herhangi bir oyuncu oluşturulduğunda artır
    }
    
    ~Player() {
        playerCount--;          // Herhangi bir oyuncu yok edildiğinde azalt
    }
};

Temel fark şudur: örnek üyelerine bir nesne üzerinden erişilirken statik üyelere doğrudan sınıf adı üzerinden erişilebilir. Örnek üyelerini “nesne başına bir tane”, statik üyeleri ise “sınıf başına bir tane” olarak düşünebilirsin.

Örnek ÜyeleriStatik Üyeler
Her nesneye özgüTüm nesneler arasında paylaşılır
Nesne oluşturulduğunda oluşturulurHerhangi bir nesne oluşturulmadan önce var olur
Nesne üzerinden erişilir: player.healthSınıf üzerinden erişilir: Player::playerCount

Statik üyeler sayaçlar, yapılandırma değerleri veya tek tek nesnelerden ziyade mantıksal olarak sınıfa ait olan herhangi bir veri için kullanışlıdır.

challenge icon

Görev

Kolay

Hem tek tek ürün ayrıntılarını hem de genel envanter istatistiklerini örnek ve statik üyeleri kullanarak izleyen bir ürün envanter sistemi oluşturalım.

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

  • Product.h: Tek tek ürünleri yönetirken aynı zamanda envanter genelindeki verileri de izleyen bir Product sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • Örnek üyeleri: name (string) ve price (double): her ürüne özgü
    • Mevcut ürünlerin kaç tane olduğunu sayan statik bir totalProducts üyesi
    • Tüm ürünlerin toplam fiyatını izleyen statik bir totalValue üyesi
    • Bir ad ve fiyat alan, örnek üyelerini başlatan ve her iki statik sayacı güncelleyen bir kurucu (sayacı artırır, fiyatı toplam değere ekler)
    • Bir ürün kaldırıldığında statik sayaçları güncelleyen bir yıkıcı (sayacı azaltır, fiyatı toplam değerden çıkarır)
    • Şu biçimde bir dize döndüren bir getInfo() yöntemi: "<name>: $<price>"
    • Şu dizeyi döndüren statik bir getInventoryStats() yöntemi: "Products: <count>, Total Value: $<value>"
  • main.cpp: Statik üyelerin tüm nesneler arasında nasıl paylaşıldığını, örnek üyelerin ise nasıl benzersiz kaldığını gösterin. Girdiden iki ürün adı ve bunların fiyatlarını okuyun (name1, price1, name2, price2: her biri ayrı bir satırda), ardından:
    • Sınıf adını kullanarak başlangıç envanter istatistiklerini yazdırın: Product::getInventoryStats()
    • Süslü parantezlerle bir kapsam bloğu oluşturun ve bu bloğun içinde ilk ad ve fiyatla bir Product oluşturun. Bilgilerini ve güncel envanter istatistiklerini yazdırın.
    • Blok sona erdikten sonra (ilk ürün yok edildikten sonra), envanter istatistiklerinin ardından "After first scope:" ifadesini yazdırın
    • İkinci ad ve fiyatla başka bir Product oluşturun. Bilgilerini ve envanter istatistiklerini yazdırın.
    • Product adı ve "Bonus" fiyatıyla üçüncü bir 5.00 oluşturun. Nihai envanter istatistiklerini yazdırın.

Statik üyeleri sınıfın dışında, başlık dosyasında (sınıf tanımından sonra) tanımlamayı unutmayın. Fiyatları, std::fixed içindeki std::setprecision(2) ve <iomanip> kullanarak iki ondalık basamakla biçimlendirin.

Başlık dosyanızı #include "Product.h" kullanarak main.cpp dosyasına ekleyin.

Kendin dene

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

using namespace std;

int main() {
    // Girdiyi oku
    string name1;
    double price1;
    string name2;
    double price2;
    
    getline(cin, name1);
    cin >> price1;
    cin.ignore();
    getline(cin, name2);
    cin >> price2;
    
    // TODO: Product::getInventoryStats() kullanarak başlangıç envanter istatistiklerini yazdır
    
    // TODO: Süslü parantezlerle bir kapsam bloğu oluştur
    // Bloğun içinde:
    //   - name1 ve price1 ile bir Product oluştur
    //   - getInfo() kullanarak bilgilerini yazdır
    //   - Mevcut envanter istatistiklerini yazdır
    
    // TODO: After the block ends, print "After first scope:"
    // Ardından envanter istatistiklerini yazdır
    
    // TODO: name2 ve price2 ile başka bir Product oluştur
    // Bilgilerini ve envanter istatistiklerini yazdır
    
    // TODO: "Bonus" adında ve 5.00 fiyatında üçüncü bir Product oluştur
    // Son envanter istatistiklerini 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

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