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 berskop) untuk mengatasi kekurangan enum tradisional bergaya C. Fitur ini memberikan keamanan tipe yang lebih kuat dan mencegah penyalahgunaan nilai enumerasi secara tidak sengaja.
enum tradisional memiliki masalah: nilai-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 menjadi int (0)
if (Red == 0) { } // Bisa di-compile: membandingkan enum dengan intEnum class 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 membandingkan 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
};Enum class terintegrasi dengan baik dalam desain OOP, membuat kodemu lebih mudah dibaca dan mendeteksi error tipe saat kompilasi, bukan saat runtime.
Tantangan
MudahMari buat sistem prioritas tugas yang menggunakan enum class untuk merepresentasikan tingkat prioritas dan status tugas yang berbeda. Ini menunjukkan bagaimana enum class memberikan keamanan tipe dan mencegah jenis bug yang terjadi pada enum tradisional.
Kamu akan menyusun kodemu dalam tiga file:
TaskTypes.h: Definisikan enum class untuk sistem tugas.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.Taskharus menyimpan nama (string), sebuahPriority, dan sebuahStatus. 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 menjadi nilai enumPriorityyang sesuai menggunakanstatic_cast). Lalu, tetapkan 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 agar nilai prioritas dan status 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 dan mencegah bug yang sulit terlihat.
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 mengubah priorityInt menjadi enum Priority
// TODO: Atur status tugas berdasarkan statusInt
// Gunakan static_cast untuk mengubah statusInt menjadi enum Status
// TODO: Panggil display() untuk menampilkan detail tugas
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