Kelas Enum dan Pengetikan Kuat
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 80 dari 104.
C++11 memperkenalkan enum classes (juga disebut enumerasi dengan lingkup) untuk mengatasi kekurangan enum tradisional bergaya C. Fitur ini memberikan keamanan tipe yang lebih kuat dan mencegah penggunaan nilai enumerasi secara tidak sengaja.
enum tradisional memiliki masalah: nilainya bocor ke lingkup sekitarnya dan secara implisit dikonversi menjadi bilangan bulat, sehingga menimbulkan bug yang sulit diketahui:
// enum tradisional: bermasalah
enum Color { Red, Green, Blue };
enum TrafficLight { Red, Yellow, Green }; // error! Red dan Green sudah didefinisikan
int x = Red; // Secara implisit dikonversi ke int (0)
if (Red == 0) { } // Bisa di-compile: membandingkan enum dengan intKelas enum mengatasi masalah ini dengan membatasi cakupan nilai dan mencegah konversi implisit:
enum class Color { Red, Green, Blue };
enum class TrafficLight { Red, Yellow, Green }; // OK, tidak ada konflik
Color c = Color::Red; // Harus menggunakan operator cakupan
// int x = c; // Error! Tidak ada konversi implisit
int x = static_cast<int>(c); // Perlu konversi eksplisit
// if (c == 0) { } // Error! Tidak bisa dibandingkan dengan int
if (c == Color::Red) { } // OK, membandingkan tipe yang samaKamu juga dapat menentukan tipe dasar untuk mengontrol memori:
enum class Status : uint8_t {
Inactive = 0,
Active = 1,
Pending = 2
};class enum terintegrasi dengan baik dalam desain OOP, membuat kodemu lebih mudah dibaca dan menangkap error tipe saat compile, bukan saat runtime.
Tantangan
MudahMari buat sistem prioritas tugas yang menggunakan enum class untuk mewakili tingkat prioritas dan status tugas yang berbeda. Ini menunjukkan bagaimana enum class memberikan keamanan tipe dan mencegah jenis bug yang dapat terjadi pada enum tradisional.
Kamu akan mengatur kodemu dalam tiga file:
TaskTypes.h: Definisikan enum class untuk sistem tugasmu.Buat enum class
Prioritydengan nilai:Low,Medium,High, danCritical. Tentukanintsebagai tipe dasarnya, dengan nilai masing-masing 1, 2, 3, dan 4.Buat enum class
Statusdengan nilai:Pending,InProgress, danCompleted.Sediakan dua fungsi pembantu:
priorityToString(Priority p): mengembalikan prioritas sebagai string ("Low", "Medium", "High", atau "Critical")statusToString(Status s): mengembalikan status sebagai string ("Pending", "InProgress", atau "Completed")
Task.h: Definisikan classTaskyang menggunakan enum class-mu.Task-mu harus menyimpan nama (string),Priority, danStatus. Constructor harus menerima nama dan prioritas, dengan status yang secara default bernilaiStatus::Pending.Implementasikan method berikut:
setStatus(Status s): memperbarui status tugasgetPriorityValue(): mengembalikan nilai integer dasar dari prioritas menggunakanstatic_castdisplay(): mencetak tugas dengan format:[name] - Priority: [priority] (Value: [value]) - Status: [status]
main.cpp: Baca tiga input:- Nama tugas (string)
- Tingkat prioritas sebagai integer (1=Low, 2=Medium, 3=High, 4=Critical)
- Status sebagai integer (0=Pending, 1=InProgress, 2=Completed)
Buat
Taskdengan nama dan prioritas yang diberikan (konversikan integer ke nilai enumPriorityyang sesuai menggunakanstatic_cast). Lalu, atur statusnya berdasarkan input ketiga. Terakhir, panggildisplay()untuk menampilkan detail tugas.
Contohnya, dengan input Fix bug, 3, dan 1:
Fix bug - Priority: High (Value: 3) - Status: InProgressDengan input Write docs, 1, dan 2:
Write docs - Priority: Low (Value: 1) - Status: CompletedDengan input Deploy app, 4, dan 0:
Deploy app - Priority: Critical (Value: 4) - Status: PendingPerhatikan bagaimana enum class menjaga nilai prioritas dan status tetap sepenuhnya terpisah. Kamu tidak bisa tanpa sengaja membandingkan Priority dengan Status atau menetapkan salah satunya ke yang lain. static_cast eksplisit yang diperlukan untuk mengonversi antara integer dan nilai enum memperjelas maksud kodemu serta mencegah bug yang sulit diketahui.
Coba sendiri
#include <iostream>
#include <string>
#include "Task.h"
using namespace std;
int main() {
// Baca input
string taskName;
int priorityInt;
int statusInt;
getline(cin, taskName);
cin >> priorityInt;
cin >> statusInt;
// TODO: Buat Task dengan nama dan prioritas yang diberikan
// Gunakan static_cast untuk mengonversi priorityInt menjadi enum Priority
// TODO: Atur status task berdasarkan statusInt
// Gunakan static_cast untuk mengonversi statusInt menjadi enum Status
// TODO: Panggil display() untuk menampilkan detail task
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 Bentuk11Konsep OOP Lanjutan
Komposisi vs PewarisanMixin melalui CRTPIdiom PimplPenghapusan TipeKelas Enum dan Pengetikan KuatPenanganan Pengecualian dalam OOPHierarki Pengecualian Kustom3Konstruktor & 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