Menu
CoddyTech

Yönlendiren 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 delege eden kurucuları kullanabilirsiniz. Delege eden bir kurucu, 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) {}
    
    // İşi birincil kurucuya devreder
    Player(std::string n) : Player(n, 100, 1) {}
    
    // Varsayılan kurucu da işi devreder
    Player() : Player("Unknown") {}
};

Yetkilendirme, başlatıcı listesinde sınıf adının ardından argümanlar yazılarak yapılır. Player() çağrıldığında, çağrı Player(std::string) yapıcısına devredilir; bu yapıcı da üç parametreli yapıcıya devreder. Zincir, hedef yapıcıdan başlayıp özgün yapıcıya doğru yürütülür.

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

class Item {
    int id;
    int value;
public:
    Item(int i, int v) : id(i), value(v) {}
    
    // Hata! Delege etme ile üye başlatma birlikte kullanılamaz
    // Item(int i) : Item(i, 0), id(i) {}
    
    // Doğru - yalnızca delege etme
    Item(int i) : Item(i, 0) {}
};

Yetki devreden kurucular, başlatma mantığını tek bir yerde toplamanıza yardımcı olur; böylece kodunuzun bakımını yapmak kolaylaşır ve yinelenen kodlardan kaynaklanan hata olasılığı azalır.

challenge icon

Görev

Kolay

Kurucu işlev çağrılarını zincirleyerek temsilci kurucuların kod tekrarını nasıl ortadan kaldırabileceğini gösteren bir bağlantı ayarları sistemi oluşturalım.

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

  • Connection.h: Çeşitli yapılandırma seçeneklerine sahip bir ağ bağlantısını temsil eden bir Connection sınıfı tanımla. Sınıfında şunlar bulunmalı:
    • Özel üyeler: host (string), port (int), timeout (saniye cinsinden int) ve secure (bool)
    • Dört parametrenin tümünü alan ve bir başlatıcı listesi kullanarak tüm üyeleri başlatan bir birincil kurucu. Bu kurucu "Connection configured: <host>:<port>" yazdırmalı.
    • Yalnızca host ve port alan; timeout için varsayılan değeri 30, secure için varsayılan değeri false kullanarak birincil kurucuya devreden bir kurucu
    • Yalnızca host alan ve port için varsayılan değer olarak 80 kullanarak iki parametreli kurucuya devreden bir kurucu
    • host için varsayılan değer olarak "localhost" kullanarak tek parametreli kurucuya devreden bir varsayılan kurucu
    • Şu biçimde bir dize döndüren bir getInfo() yöntemi: "<host>:<port> (timeout: <timeout>s, secure: <yes/no>)"
  • main.cpp: Farklı kurucuları kullanarak bağlantılar oluşturup devir zincirini göster. Girdiden bir ana bilgisayar adı ve bağlantı noktası numarası oku (her biri ayrı bir satırda), ardından:
    • Varsayılan kurucuyu kullanarak bir Connection oluştur
    • Girdideki yalnızca ana bilgisayar adını kullanarak bir Connection oluştur
    • Girdideki ana bilgisayar adını ve bağlantı noktası numarasını kullanarak bir Connection oluştur
    • Girdideki ana bilgisayar adı ve bağlantı noktası numarasını, 60 değerinde bir zaman aşımını ve true olarak ayarlanmış güvenli bağlantı seçeneğini kullanarak bir Connection oluştur
    • Her bağlantı için, her biri ayrı bir satırda olacak şekilde getInfo() çıktısını yazdır

Devir zinciri şu şekilde işler: Varsayılan kurucu, tek parametreli kurucuyu çağırır; bu kurucu iki parametreli kurucuyu, o da dört parametreli birincil kurucuyu çağırır. Bu, oluşturulan her nesne için "Connection configured" mesajının her zaman birincil kurucu tarafından bir kez yazdırıldığı anlamına gelir.

getInfo() içindeki güvenli bağlantı durumu için, secure doğruysa "yes", aksi takdirde "no" yazdır.

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

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 kurucuyu kullanarak bir Connection oluştur

    // TODO: Yalnızca girdideki host değerini kullanarak bir Connection oluştur

    // TODO: Girdideki host ve port değerlerini kullanarak bir Connection oluştur

    // TODO: Girdideki host ve port değerleriyle, timeout=60 ve secure=true olacak şekilde bir Connection oluştur

    // TODO: Her bağlantı için getInfo() sonucunu, her biri ayrı bir satırda olacak şekilde 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