Sử dụng các kiểu enum có thể bảo vệ chúng ta khỏi nhiều mối đe doạ, nhưng một cũng có một số vấn đề với kiểu enum. Hãy xem →
1 2 3 4 5 6 7 |
enum weekday {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; int main(void) { weekday d = SATURDAY; d = weekday(d + 1); return 0; } |
Toán tử ‘+’ không không biết gì về các ngày trong tuần và nó không quan tâm đến từ “SATURDAY”. Điều đó có thể dẫn đến việc giá trị của biến d có thể nằm ngoài khoảng cho phép của nó.
Chính vì vậy chúng ta không thể code như này:
1 |
d = d + 1; |
mà phải code như này:
1 |
d = weekday(d + 1); |
Chúng ta có thể tránh vấn đề này bằng cách nạp chồng toán tử ‘+’ của enum weekday.
Làm như sau →
1 2 3 4 5 6 7 8 9 10 11 |
enum weekday {SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY}; weekday operator+(weekday day, int days) { return weekday((int(day) + days) % 7); } int main(void) { weekday d = SATURDAY; d = d + 1; return 0; } |
Bây giờ, việc cộng một giá trị int vào một biến kiểu weekday sẽ tính đến tính chất chu kỳ của ngày trong tuần, ví dụ: SUNDAY + 15 sẽ là MONDAY.
Chú ý dòng sau:
return weekday((int(day) + days) % 7);
Chúng ta có thể viết nó dưới một hình thức đơn giản hơn, như thế này không ?
return weekday((day + days) % 7);
No, chúng ta không thể. Biểu thức ‘day + days’ sẽ gọi đệ quy đến toán tử nạp chồng của chúng ta và chương trình sẽ sụp đổ.