Konstruktor Delegasi
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 23 dari 104.
Jika kamu memiliki beberapa constructor yang menggunakan logika inisialisasi yang sama, kamu dapat menggunakan constructor delegasi untuk menghindari duplikasi kode. Constructor delegasi memanggil constructor lain dari class yang sama dalam daftar inisialisasinya.
class Player {
std::string name;
int health;
int level;
public:
// Konstruktor utama melakukan pekerjaan sebenarnya
Player(std::string n, int h, int lvl)
: name(n), health(h), level(lvl) {}
// Mendelegasikan tugas ke konstruktor utama
Player(std::string n) : Player(n, 100, 1) {}
// Konstruktor default juga mendelegasikan tugas
Player() : Player("Unknown") {}
};Pendelegasian terjadi dalam daftar initializer menggunakan nama class yang diikuti argumen. Saat Player() dipanggil, konstruktor tersebut mendelegasikan ke Player(std::string), yang kemudian mendelegasikan ke konstruktor dengan tiga parameter. Rangkaian ini dijalankan dari konstruktor tujuan kembali ke konstruktor awal.
Ada satu aturan penting: constructor yang mendelegasikan tidak boleh memiliki anggota lain dalam daftar inisialisasinya. Delegasi harus menjadi satu-satunya item:
class Item {
int id;
int value;
public:
Item(int i, int v) : id(i), value(v) {}
// error! Delegasi tidak bisa digabung dengan inisialisasi anggota
// Item(int i) : Item(i, 0), id(i) {}
// Benar: hanya delegasi
Item(int i) : Item(i, 0) {}
};Constructor delegasi membantu memusatkan logika inisialisasi di satu tempat, sehingga kodemu lebih mudah dipelihara dan lebih kecil kemungkinannya mengalami error akibat duplikasi kode.
Tantangan
MudahMari buat sistem pengaturan koneksi yang menunjukkan cara constructor delegasi dapat menghilangkan duplikasi kode dengan merangkai pemanggilan constructor.
Kamu akan membuat dua file untuk mengatur kodemu:
Connection.h: Definisikan classConnectionyang merepresentasikan koneksi jaringan dengan berbagai opsi konfigurasi. Class-mu harus memiliki:- Member private:
host(string),port(int),timeout(int dalam detik), dansecure(bool) - Constructor utama yang menerima keempat parameter dan menginisialisasi semua member menggunakan initializer list. Constructor ini harus mencetak
"Connection configured: <host>:<port>" - Constructor yang hanya menerima
hostdanport, lalu mendelegasikan ke constructor utama dengan nilai defaulttimeout30dan nilai defaultsecurefalse - Constructor yang hanya menerima
host, lalu mendelegasikan ke constructor dua parameter dengan nilai defaultport80 - Default constructor yang mendelegasikan ke constructor satu parameter dengan nilai default
host"localhost" - Method
getInfo()yang mengembalikan string dengan format:"<host>:<port> (timeout: <timeout>s, secure: <yes/no>)"
- Member private:
main.cpp: Tunjukkan rantai delegasi dengan membuat koneksi menggunakan constructor yang berbeda. Baca nama host dan nomor port dari input (masing-masing pada baris terpisah), lalu:- Buat
Connectionmenggunakan default constructor - Buat
Connectionhanya dengan host dari input - Buat
Connectiondengan host dan port dari input - Buat
Connectiondengan host dari input, port dari input, timeout sebesar60, dan secure bernilaitrue - Cetak
getInfo()untuk setiap koneksi, satu per baris
- Buat
Rantai delegasi berjalan seperti ini: default constructor memanggil constructor satu parameter, yang memanggil constructor dua parameter, yang memanggil constructor utama dengan empat parameter. Artinya, pesan "Connection configured" dicetak sekali untuk setiap object yang dibuat, selalu dari constructor utama.
Untuk status secure dalam getInfo(), cetak "yes" jika secure bernilai true, jika tidak, cetak "no".
Sertakan header file-mu di main.cpp menggunakan #include "Connection.h".
Coba sendiri
#include <iostream>
#include <string>
#include "Connection.h"
using namespace std;
int main() {
// Baca input
string host;
int port;
cin >> host;
cin >> port;
// TODO: Buat Connection menggunakan konstruktor default
// TODO: Buat Connection hanya menggunakan host dari input
// TODO: Buat Connection menggunakan host dan port dari input
// TODO: Buat Connection dengan host dan port dari input, timeout=60, secure=true
// TODO: Cetak getInfo() untuk setiap koneksi, satu per baris
return 0;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online