Menu
CoddyTech

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 int

Enum 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 sama

Kamu 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.

challenge icon

Tantangan

Mudah

Mari 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 Priority dengan nilai: Low, Medium, High, dan Critical. Tentukan int sebagai tipe dasarnya, dengan nilai masing-masing 1, 2, 3, dan 4.

    Buat enum class Status dengan nilai: Pending, InProgress, dan Completed.

    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 class Task yang menggunakan enum class-mu.

    Task harus menyimpan nama (string), sebuah Priority, dan sebuah Status. Constructor harus menerima nama dan prioritas, dengan status yang secara default bernilai Status::Pending.

    Implementasikan method berikut:

    • setStatus(Status s): memperbarui status tugas
    • getPriorityValue(): mengembalikan nilai integer dasar dari prioritas menggunakan static_cast
    • display(): mencetak tugas dengan format: [name] - Priority: [priority] (Value: [value]) - Status: [status]
  • main.cpp: Baca tiga input:
    1. Nama tugas (string)
    2. Tingkat prioritas sebagai integer (1=Low, 2=Medium, 3=High, 4=Critical)
    3. Status sebagai integer (0=Pending, 1=InProgress, 2=Completed)

    Buat Task dengan nama dan prioritas yang diberikan (konversikan integer menjadi nilai enum Priority yang sesuai menggunakan static_cast). Lalu, tetapkan statusnya berdasarkan input ketiga. Terakhir, panggil display() untuk menampilkan detail tugas.

Contohnya, dengan input Fix bug, 3, dan 1:

Fix bug - Priority: High (Value: 3) - Status: InProgress

Dengan input Write docs, 1, dan 2:

Write docs - Priority: Low (Value: 1) - Status: Completed

Dengan input Deploy app, 4, dan 0:

Deploy app - Priority: Critical (Value: 4) - Status: Pending

Perhatikan 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;
}
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