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.
Görev
KolayKurucu 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 birConnectionsınıfı tanımla. Sınıfında şunlar bulunmalı:- Özel üyeler:
host(string),port(int),timeout(saniye cinsinden int) vesecure(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
hostveportalan;timeoutiçin varsayılan değeri30,secureiçin varsayılan değerifalsekullanarak birincil kurucuya devreden bir kurucu - Yalnızca
hostalan veportiçin varsayılan değer olarak80kullanarak iki parametreli kurucuya devreden bir kurucu hostiç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>)"
- Özel üyeler:
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
Connectionoluştur - Girdideki yalnızca ana bilgisayar adını kullanarak bir
Connectionoluştur - Girdideki ana bilgisayar adını ve bağlantı noktası numarasını kullanarak bir
Connectionoluştur - Girdideki ana bilgisayar adı ve bağlantı noktası numarasını,
60değerinde bir zaman aşımını vetrueolarak ayarlanmış güvenli bağlantı seçeneğini kullanarak birConnectionoluştur - Her bağlantı için, her biri ayrı bir satırda olacak şekilde
getInfo()çıktısını yazdır
- Varsayılan kurucuyu kullanarak bir
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;
}
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
1Nesne Yönelimli Programlamanın Temelleri
Harici DosyalarC++ Derleme ve Derleme SüreciHeader Dosyaları ve Kaynak DosyalarıNamespace'ler ve KapsamC++'ta Nesne Yönelimli Programlamaya GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriTekrar - Basit Hesap Makinesi4Sınıf Özellikleri
Nesne ve Statik ÜyelerGetter ve Setter'larconst Üye Fonksiyonlarımutable Anahtar SözcüğüStatik 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 DüzeyleriCtor ve Dtor Çağrı SırasıMetot Geçersiz KılmaVirtual Fonksiyonlar ve VTableÇoklu KalıtımVirtual KalıtımÖzet - Çalışan Hiyerarşisi2Bellek Yönetimi
Stack ve Heap Belleğiİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++’ta Akıllı İşaretçilerC++’ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'ta Erişim BelirleyicileriErişim Belirleyicilerine Derinlemesine BakışBilgi GizlemeStruct ve Class Karşılaştırmasıİç İçe ve İç SınıflarTekrar - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme Zamanı 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ıDinamik Tür Dönüştürme ve RTTITekrar - Şekil Hesaplayıcı11İleri Düzey OOP Kavramları
Bileşim ve KalıtımCRTP ile Mixin'lerPimpl İdiomuTür SilmeEnum Sınıfları ve Güçlü TürlemeOOP'de İstisna YönetimiÖzel İstisna Hiyerarşileri14Tasarım Kalıpları Bölüm 2
Komut KalıbıAdaptör KalıbıDekoratör KalıbıŞablon Metot KalıbıDurum KalıbıBileşik KalıpBir Kalıp Olarak RAII3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopyalama YapıcısıTaşıma YapıcısıYapıcı Başlatma ListeleriYönlendiren YapıcılarYıkıcıları Derinlemesine İncelemeÜç / 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örleri Aşırı YüklemeKarşılaştırma Operatörlerini Aşırı YüklemeAkış OperatörleriAtama Operatörünü Aşırı Yükleme[] ve () Operatörlerini Aşırı YüklemeTür Dönüşüm OperatörleriTekrar - Matrix Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeDeğişken Sayıda Argüman Alan ŞablonlarSFINAE ve Tür Özelliklerinin TemelleriTekrar: Genel Amaçlı KapsayıcıKendi başına pratik yap: Online C++ derleyicisi