บ่อยครั้งหนึ่งต้องมีการแจกแจงหลายประเภทด้วยกัน บางครั้งคนหนึ่งมีชื่อปะทะกัน วิธีแก้ปัญหาสองวิธีสำหรับสิ่งนี้: ใช้เนมสเปซหรือใช้ชื่อองค์ประกอบ enum ที่ 'ใหญ่กว่า' อย่างไรก็ตามโซลูชันเนมสเปซยังมีการใช้งานที่เป็นไปได้สองแบบ: คลาสดัมมี่ที่มี enum ซ้อนกันหรือเนมสเปซแบบเต็ม
ฉันกำลังมองหาข้อดีข้อเสียของทั้งสามวิธี
ตัวอย่าง:
// oft seen hand-crafted name clash solution
enum eColors { cRed, cColorBlue, cGreen, cYellow, cColorsEnd };
enum eFeelings { cAngry, cFeelingBlue, cHappy, cFeelingsEnd };
void setPenColor( const eColors c ) {
switch (c) {
default: assert(false);
break; case cRed: //...
break; case cColorBlue: //...
//...
}
}
// (ab)using a class as a namespace
class Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
class Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
// a real namespace?
namespace Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
namespace Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
enum e {...}
enums สามารถเป็นแบบไม่ระบุตัวตนได้กล่าวคือenum {...}
เหมาะสมกว่าเมื่อรวมอยู่ในเนมสเปซหรือคลาส