Menu
CoddyTech

Yapıcı Başlatma Listeleri

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

Player(std::string n, int h) : name(n), health(h) {} gibi iki nokta üst üste sözdizimini önceki derslerde gördün. Buna üye başlatıcı listesi denir ve C++'ta üyeleri başlatmanın tercih edilen yoludur.

Başlatıcı listesi, yapıcının parametre listesinden sonra iki nokta üst üste işaretiyle başlar. Her üye, değerine doğrudan ve virgüllerle ayrılmış şekilde başlatılır:

class Rectangle {
    int width;
    int height;
    const int id;
    int& reference;
public:
    Rectangle(int w, int h, int i, int& r) 
        : width(w), height(h), id(i), reference(r) {
        // Kurucu gövdesi (boş olabilir)
    }
};

Oluşturucunun gövdesinde atama yapmak yerine neden başlatıcı listeleri kullanılır? Atama yapıldığında, üyeler önce varsayılan değerlerle oluşturulur, ardından yeni değerler atanır. Başlatıcı listeleri kullanıldığında üyeler doğrudan doğru değerlerle oluşturulur; bu daha verimlidir ve bazen gereklidir.

Bazı üyeler liste kullanılarak başlatılmalıdır:

  • const üyelerine yapıcı işleminden sonra değer atanamaz
  • Referans üyeler - başlatma sırasında bağlanmalıdır
  • Varsayılan kurucuları olmayan üyeler
class Player {
    const int maxHealth;    // Başlatıcı listesi kullanılmalı
    std::string name;
public:
    // Bu çalışır
    Player(int max, std::string n) : maxHealth(max), name(n) {}
    
    // Bu derlenmez:
    // Player(int max) { maxHealth = max; }  // Hata!
};

Üyeler, başlatma listesindeki sıraya göre değil, sınıfta bildirildikleri sıraya göre başlatılır. Karışıklığı önlemek için başlatma listenizi her zaman bildirim sırasına göre yazın.

challenge icon

Görev

Kolay

Üye başlatıcı listelerinin ne zaman ve neden gerekli olduğunu gösteren bir oyun motoru yapılandırma sistemi oluşturalım. Başlatıcı liste sözdizimi kullanılarak başlatılması gereken üyeleri olan bir GameConfig sınıfı oluşturacaksın.

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

  • GameConfig.h: Oyun ayarlarını saklayan bir GameConfig sınıfı tanımla. Sınıfında şunlar bulunmalı:
    • Bir const std::string gameName: oluşturulduktan sonra değiştirilemeyen oyunun başlığı
    • Bir const int maxPlayers: oluşturulurken sabitlenen maksimum oyuncu sayısı
    • Bir int& difficultyRef: harici bir zorluk ayarına başvuru
    • Ekran ayarları için sıradan üyeler olan bir int screenWidth ve bir int screenHeight
    • Gerekli tüm parametreleri alan ve her üyeyi başlatıcı listeyi kullanarak başlatan bir kurucu. Başlatıcı liste, sınıfta üyelerin tanımlandığı sırayı izlemeli
    • Yapılandırmayı şu biçimde yazdıran bir display() yöntemi:
      Game: <gameName>
      Max Players: <maxPlayers>
      Difficulty: <difficultyRef value>
      Resolution: <screenWidth>x<screenHeight>
  • main.cpp: Yapılandırma değerlerini girdiden oku ve bir GameConfig nesnesi oluştur. Şunları yapman gerekecek:
    • Oyun adını (string), maksimum oyuncu sayısını (int), zorluk seviyesini (int), genişliği (int) ve yüksekliği (int) girdiden oku: her biri ayrı bir satırda olmalı
    • Yapılandırmanın başvuracağı zorluk seviyesi için yerel bir int değişkeni oluştur
    • Başlatıcı liste kurucusunu kullanarak bir GameConfig nesnesi oluştur
    • İlk yapılandırmayı göstermek için display() yöntemini çağır
    • Zorluk seviyesi değişkenini doğrudan değiştir (değerini 2 ile çarp)
    • "After difficulty change:" yazdır
    • Başvurunun güncellenmiş değeri yansıttığını göstermek için display() yöntemini yeniden çağır

Bu alıştırma, başlatıcı listelerin neden önemli olduğunu vurgular: const üyelerin ve başvuru üyen kurucu gövdesinde atanamaz. Bunlar listede başlatılmalıdır. Başvuru üyesi ayrıca, özgün değişkendeki değişikliklerin yapılandırma nesnesi üzerinden nasıl yansıtıldığını da gösterir.

Başlık dosyanı main.cpp dosyasına #include "GameConfig.h" kullanarak ekle.

Kendin dene

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

using namespace std;

int main() {
    // Giriş değerlerini oku
    string gameName;
    getline(cin, gameName);
    
    int maxPlayers;
    cin >> maxPlayers;
    
    int difficulty;
    cin >> difficulty;
    
    int width;
    cin >> width;
    
    int height;
    cin >> height;
    
    // TODO: Başlatıcı listesi yapıcısını kullanarak bir GameConfig nesnesi oluştur
    // Yapıcı şu değerleri almalı: gameName, maxPlayers, difficulty (referans yoluyla), width, height
    
    // TODO: Başlangıç yapılandırmasını göstermek için display() fonksiyonunu çağır
    
    // TODO: difficulty değişkenini doğrudan değiştir (2 ile çarp)
    
    // TODO: "After difficulty change:" yazdır
    
    // TODO: Güncellenmiş yapılandırmayı göstermek için display() fonksiyonunu tekrar çağı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