มีความสามารถในการใช้งานร่วมกันได้สวย (fact) ในการ refactor เป็น enum ในชั้นเรียนโดยไม่ต้องเขียนรหัสใหม่ซึ่งหมายความว่าคุณสามารถทำสิ่งที่คุณขอให้ทำได้โดยไม่ต้องแก้ไขมากเกินไป
(§) ตามที่ ElementW ชี้ให้เห็นในความคิดเห็นรหัสtype_traitsไม่ทำงานดังนั้นเช่นเราไม่สามารถใช้งานอัตโนมัติ ฯลฯ อาจมีวิธีจัดการกับสิ่งเหล่านี้ แต่ท้ายที่สุดแล้วการแปลง enum เป็นคลาส และเป็นความผิดพลาดเสมอในการทำลาย C ++
enum struct
และenum class
รายละเอียดจะเกี่ยวกับการกำหนดขอบเขตเพื่อให้ได้เป็นส่วนหนึ่งของเรื่องนี้
Enum ดั้งเดิมของคุณคือเช่น 'สัตว์เลี้ยง' (นี่เป็นตัวอย่างเท่านั้น!)
enum pet {
fish, cat, dog, bird, rabbit, other
};
(1) คุณปรับเปลี่ยนสิ่งนั้นเป็นเช่น petEnum (เพื่อซ่อนจากรหัสที่มีอยู่ของคุณ)
enum petEnum {
fish, cat, dog, bird, rabbit, other
};
(2) คุณเพิ่มการประกาศคลาสใหม่ด้านล่าง (ตั้งชื่อด้วย enum ดั้งเดิม)
class pet {
private:
petEnum value;
pet() {}
public:
pet(const petEnum& v) : value{v} {} //not explicit here.
operator petEnum() const { return value; }
pet& operator=(petEnum v) { value = v; return *this;}
bool operator==(const petEnum v) const { return value == v; }
bool operator!=(const petEnum v) const { return value != v; }
// operator std::string() const;
};
(3) ตอนนี้คุณสามารถเพิ่มวิธีการเรียนใด ๆ ที่คุณต้องการให้กับชั้นเรียนสัตว์เลี้ยงของคุณ เช่น. ผู้ประกอบการสตริง
pet::operator std::string() const {
switch (value) {
case fish: return "fish";
case cat: return "cat";
case dog: return "dog";
case bird: return "bird";
case rabbit: return "rabbit";
case other: return "Wow. How exotic of you!";
}
}
ตอนนี้คุณสามารถใช้เช่น std :: cout ...
int main() {
pet myPet = rabbit;
if(myPet != fish) {
cout << "No splashing! ";
}
std::cout << "I have a " << std::string(myPet) << std::endl;
return 0;
}