Menu
Coddy logo textTech

Temsilci Yapıcılar

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

Ortak başlatma mantığını paylaşan birden fazla kurucunuz olduğunda, kod tekrarını önlemek için devreden kurucular (delegating constructors) kullanabilirsiniz. Bir devreden kurucu, kendi başlatıcı listesinde aynı sınıfın başka bir kurucusunu çağırır.

class Player {
    std::string name;
    int health;
    int level;
public:
    // Birincil kurucu - asıl işi yapar
    Player(std::string n, int h, int lvl) 
        : name(n), health(h), level(lvl) {}
    
    // Birincil kurucuya delege eder
    Player(std::string n) : Player(n, 100, 1) {}
    
    // Varsayılan kurucu da delege eder
    Player() : Player("Unknown") {}
};

Delegasyon, sınıf adının ardından argümanların kullanıldığı başlatıcı listesinde gerçekleşir. Player() çağrıldığında, Player(std::string) yapıcısına delege eder, o da daha sonra üç parametreli yapıcıya delege eder. Zincir, hedef yapıcıdan orijinal yapıcıya doğru yürütülür.

Önemli bir kural var: Yetki devreden bir kurucunun başlatıcı listesinde başka üyeler bulunamaz. Yetki devri tek öğe olmalıdır:

class Item {
    int id;
    int value;
public:
    Item(int i, int v) : id(i), value(v) {}
    
    // Hata! Delegasyon ile üye ilklendirme bir arada kullanılamaz
    // Item(int i) : Item(i, 0), id(i) {}
    
    // Doğru - sadece delegasyon
    Item(int i) : Item(i, 0) {}
};

Temsilci kurucular (delegating constructors), başlatma mantığını tek bir yerde merkezileştirmeye yardımcı olarak kodunuzun bakımını kolaylaştırır ve yinelenen kodlardan kaynaklanan hatalara karşı daha az eğilimli hale getirir.

challenge icon

Görev

Kolay

Yapıcı çağrılarını birbirine zincirleyerek delegasyon yapan yapıcıların kod tekrarını nasıl ortadan kaldırabileceğini gösteren bir bağlantı ayarları sistemi oluşturalım.

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

  • Connection.h: Çeşitli yapılandırma seçeneklerine sahip bir ağ bağlantısını temsil eden bir Connection sınıfı tanımlayın. Sınıfınız şunlara sahip olmalıdır:
    • Private üyeler: host (string), port (int), timeout (saniye cinsinden int) ve secure (bool)
    • Dört parametreyi alan ve bir başlatıcı listesi kullanarak tüm üyeleri başlatan bir birincil yapıcı. Bu yapıcı "Connection configured: <host>:<port>" yazdırmalıdır
    • Yalnızca host ve port alan ve timeout değerini varsayılan olarak 30, secure değerini ise varsayılan olarak false kabul ederek birincil yapıcıya delegasyon yapan bir yapıcı
    • Yalnızca host alan ve port değerini varsayılan olarak 80 kabul ederek iki parametreli yapıcıya delegasyon yapan bir yapıcı
    • host değerini varsayılan olarak "localhost" kabul ederek tek parametreli yapıcıya delegasyon yapan bir varsayılan yapıcı
    • Şu biçimde bir string döndüren bir getInfo() metodu: "<host>:<port> (timeout: <timeout>s, secure: <yes/no>)"
  • main.cpp: Farklı yapıcıları kullanarak bağlantılar oluşturarak delegasyon zincirini gösterin. Girdiden bir host adı ve port numarası okuyun (her biri ayrı bir satırda), ardından:
    • Varsayılan yapıcıyı kullanarak bir Connection oluşturun
    • Girdiden yalnızca host değerini kullanarak bir Connection oluşturun
    • Girdiden hem host hem de port değerlerini kullanarak bir Connection oluşturun
    • Girdi host'u, girdi port'u, 60 zaman aşımı ve true olarak ayarlanmış secure değeriyle bir Connection oluşturun
    • Her bağlantı için getInfo() çıktısını satır başına bir tane olacak şekilde yazdırın

Delegasyon zinciri şu şekilde ilerler: varsayılan yapıcı, tek parametreli yapıcıyı çağırır; bu yapıcı iki parametreli yapıcıyı çağırır; iki parametreli yapıcı da dört parametreli birincil yapıcıyı çağırır. Bu, "Connection configured" mesajının oluşturulan her nesne için bir kez ve her zaman birincil yapıcıdan yazdırılması anlamına gelir.

getInfo() içindeki secure durumu için secure true ise "yes", aksi takdirde "no" yazdırın.

Başlık dosyanızı main.cpp içine #include "Connection.h" kullanarak ekleyin.

Kendin dene

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

using namespace std;

int main() {
    // Girdiyi oku
    string host;
    int port;
    cin >> host;
    cin >> port;

    // TODO: Varsayılan yapıcıyı (default constructor) kullanarak bir Connection oluşturun

    // TODO: Sadece girdiden alınan host bilgisini kullanarak bir Connection oluşturun

    // TODO: Girdiden alınan hem host hem de port bilgilerini kullanarak bir Connection oluşturun

    // TODO: Girdi host, girdi port, timeout=60 ve secure=true parametreleriyle bir Connection oluşturun

    // TODO: Her bağlantı için getInfo() sonucunu her satıra bir tane gelecek şekilde yazdırın

    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