Menu
CoddyTech

Nested dan Inner class

Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 38 dari 104.

class bersarang adalah class yang didefinisikan di dalam class lain. Teknik ini membantu mengatur kode dengan mengelompokkan tipe-tipe yang berkaitan dan dapat meningkatkan enkapsulasi dengan menyembunyikan detail implementasi.

class LinkedList {
public:
    class Node {    // class bersarang
        int data;
        Node* next;
    public:
        Node(int d) : data(d), next(nullptr) {}
        friend class LinkedList;
    };
    
private:
    Node* head;
    
public:
    LinkedList() : head(nullptr) {}
};

class bersarang Node sangat terkait erat dengan LinkedList, class ini hanya masuk akal dalam konteks tersebut. Dengan membuatnya bersarang, kita menunjukkan hubungan ini dan menghindari memenuhi namespace global dengan nama umum seperti "Node".

class bersarang mengikuti aturan akses yang sama dengan yang telah kamu pelajari. class bersarang yang dideklarasikan di bagian private hanya dapat diakses di dalam class luar.

Jika dideklarasikan sebagai public, kode eksternal dapat menggunakannya dengan operator cakupan:

LinkedList::Node node(42);    // Hanya jika Node bersifat public

Satu detail penting tentang arah akses: class bersarang adalah anggota dari class yang membungkusnya dan memiliki hak akses yang sama seperti anggota lainnya, sehingga class tersebut dapat mengakses anggota private dari class yang membungkusnya tanpa deklarasi friend. Namun, arah sebaliknya tidak otomatis berlaku: class yang membungkusnya tidak dapat mengakses anggota private dari class bersarang.

Itulah sebabnya Node mendeklarasikan friend class LinkedList; pada contoh di atas: deklarasi friend memberikan akses kepada LinkedList yang membungkusnya ke anggota privat milik Node, satu arah yang tidak terjadi secara otomatis.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pengelolaan tugas sederhana yang mengatur tugas dalam sebuah proyek. Ini adalah contoh yang tepat untuk class bertingkat: Task hanya masuk akal dalam konteks Project, jadi kita akan menempatkannya di dalam Project agar kode kita tetap teratur dan namespace global tidak tercemar.

Kamu akan membuat dua file untuk mengatur kodemu:

  • Project.h: Definisikan class Project yang berisi class Task bertingkat.

    Class Task bertingkat harus dideklarasikan di bagian public dari Project agar bisa diakses dari luar. Class ini harus menyimpan nama tugas (string) dan status penyelesaian (bool). Buat constructor yang menerima nama dan menetapkan tugas sebagai belum selesai secara default. Sertakan method complete() untuk menandainya selesai, isComplete() untuk memeriksa statusnya, dan getName() untuk mengambil namanya.

    Class Project sendiri harus menyimpan nama proyek (string) dan kumpulan pointer Task. Sediakan constructor yang menerima nama proyek, method addTask(const std::string& taskName) yang membuat tugas baru dan menambahkannya ke proyek, method completeTask(const std::string& taskName) yang mencari dan menyelesaikan tugas berdasarkan nama, serta method displayStatus() yang menampilkan nama proyek diikuti status setiap tugas.

    Karena Task bertingkat di dalam Project, class Project dapat bekerja langsung dengan tugas. Jangan lupa membersihkan tugas yang dialokasikan secara dinamis di destructor.

  • main.cpp: Satukan semuanya dengan membaca nama proyek dan dua nama tugas dari input (total tiga baris). Buat Project dengan nama yang diberikan, tambahkan kedua tugas ke dalamnya, lalu tampilkan status awal. Selesaikan tugas pertama dan tampilkan status sekali lagi untuk menunjukkan perubahannya.

    Format output untuk displayStatus() harus seperti berikut:

    Project: <project_name>
      - <task_name>: [incomplete]
      - <task_name>: [complete]

    Gunakan [complete] atau [incomplete] berdasarkan status setiap tugas.

Tantangan ini menunjukkan cara class bertingkat membantu mengatur tipe-tipe yang saling berkaitan: class Task sangat terkait dengan Project dan tidak akan masuk akal jika berdiri sendiri. Dengan menempatkannya di dalam class lain, kita menunjukkan hubungan ini dengan jelas dalam struktur kode.

Coba sendiri

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

using namespace std;

int main() {
    // Baca input
    string projectName;
    string task1Name;
    string task2Name;
    
    getline(cin, projectName);
    getline(cin, task1Name);
    getline(cin, task2Name);
    
    // TODO: Buat Project dengan nama yang diberikan
    
    // TODO: Tambahkan kedua tugas ke proyek
    
    // TODO: Tampilkan status awal
    
    // TODO: Selesaikan tugas pertama
    
    // TODO: Tampilkan status lagi untuk menunjukkan perubahannya
    
    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