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 publicSatu 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.
Tantangan
MudahMari 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 classProjectyang berisi classTaskbertingkat.Class
Taskbertingkat harus dideklarasikan di bagian public dariProjectagar 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 methodcomplete()untuk menandainya selesai,isComplete()untuk memeriksa statusnya, dangetName()untuk mengambil namanya.Class
Projectsendiri harus menyimpan nama proyek (string) dan kumpulan pointerTask. Sediakan constructor yang menerima nama proyek, methodaddTask(const std::string& taskName)yang membuat tugas baru dan menambahkannya ke proyek, methodcompleteTask(const std::string& taskName)yang mencari dan menyelesaikan tugas berdasarkan nama, serta methoddisplayStatus()yang menampilkan nama proyek diikuti status setiap tugas.Karena
Taskbertingkat di dalamProject, classProjectdapat 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). BuatProjectdengan 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;
}
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