Menu
CoddyTech

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.

challenge icon

Tantangan

Mudah

Mari 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 class Connection yang merepresentasikan koneksi jaringan dengan berbagai opsi konfigurasi. Class-mu harus memiliki:
    • Member private: host (string), port (int), timeout (int dalam detik), dan secure (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 host dan port, lalu mendelegasikan ke constructor utama dengan nilai default timeout 30 dan nilai default secure false
    • Constructor yang hanya menerima host, lalu mendelegasikan ke constructor dua parameter dengan nilai default port 80
    • 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>)"
  • 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 Connection menggunakan default constructor
    • Buat Connection hanya dengan host dari input
    • Buat Connection dengan host dan port dari input
    • Buat Connection dengan host dari input, port dari input, timeout sebesar 60, dan secure bernilai true
    • Cetak getInfo() untuk setiap koneksi, satu per baris

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;
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Object

Latihan sendiri: Compiler C++ online