enum class
التعدادات المحكومة enum class
enum class تعريف حديث للتعدادات (C++11) يمنع تسريب أسمائها للنطاق المحيط ويمنع تحويلها الضمني لعدد صحيح — أأمن من enum التقليدية.
التعداد التقليدي (enum) الموروث من C يسرّب أسماء قيمه للنطاق المحيط مباشرة (فقد تتعارض مع اسم آخر) ويسمح بتحويلها الضمني لعدد صحيح دون تنبيه، ما يسبب أخطاء منطقية صامتة. enum class يحل الاثنين: يجب الوصول للقيمة عبر Name::Value، ولا يوجد تحويل ضمني لعدد صحيح إلا بتحويل صريح static_cast.
الصياغة
enum class Name {
Value1,
Value2
};
Name v = Name::Value1;📄 مثال
enum class Status {
Pending,
Active,
Closed
};
Status s = Status::Active;
if (s == Status::Active) {
std::cout << "الحساب فعّال";
}
// int x = s; // خطأ ترجمة — يمنع enum class التحويل الضمنيأهم النقاط
| العنصر | الوظيفة |
|---|---|
| enum class Name { } | تعداد محكوم النطاق، القيم تُنادى عبر Name::Value |
| enum Name { } (تقليدية) | الصيغة القديمة الموروثة من C — تسرّب الأسماء وتسمح بتحويل ضمني |
| static_cast<int>(v) | التحويل الصريح الوحيد المسموح من enum class لعدد صحيح |
💡 نصائح عملية
- استخدم enum class دائمًا بكود جديد بدل enum التقليدية — أمان أكبر بلا أي تكلفة أداء إضافية
- يمكن تحديد النوع الأساسي صراحة: enum class Status : uint8_t { ... } لتوفير الذاكرة
⚠️ أخطاء شائعة
- توقّع مقارنة enum class مباشرة مع عدد صحيح بدون تحويل صريح — يفشل البناء وهذا مقصود للأمان
- استخدام enum التقليدية بمشروع كبير فتتصادم أسماء القيم بين تعدادات مختلفة بنفس النطاق
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار CPP الكامل بالعربي.