ENUMها
در سیپلاسپلاس، ENUMها (یا Enumeraions) نوع دادهای ویژهای هستند که مجموعهای ثابت از مقادیر نامگذاریشده را تعریف میکنند. استفاده از ENUMها باعث افزایش خوانایی، کاهش خطاهای منطقی و جلوگیری از استفاده از "اعداد جادویی" در کد میشود. این نوع داده برای مدلسازی وضعیتها، دستهبندیها، اولویتها یا هر مجموعه محدود دیگری از گزینهها بسیار مناسب است و نقش مهمی در طراحی سیستمها و الگوریتمها دارد.
ENUMها در سیپلاسپلاس به دو دسته کلی تقسیم میشوند: ENUMهای بدون محدودیت (unscoped) و ENUMهای محدود (scoped یا با enum class). استفاده از ENUMهای محدود امنیت نوع را افزایش میدهد، از تداخل نامها جلوگیری میکند و مانع تبدیل ضمنی به int میشود. این ویژگیها برای پروژههای پیچیده و بزرگ بسیار حیاتی هستند.
در این آموزش، شما خواهید آموخت چگونه ENUMها را تعریف کنید، مقادیر صریح به آنها اختصاص دهید، آنها را با کلاسها و الگوریتمها ترکیب کنید و از هر دو نوع ENUM در سناریوهای واقعی توسعه استفاده نمایید. مثالهای عملی نشان میدهند که ENUMها چگونه خوانایی و نگهداری کد را بهبود میبخشند و کاربرد آنها در سیستمهای تولیدی متوسط و بزرگ چگونه است.
مثال پایه
text\#include <iostream>
using namespace std;
// ENUM بدون محدودیت
enum Rang { Ghermez, Sabz, Abi };
int main() {
Rang rangFav = Sabz;
switch(rangFav) {
case Ghermez:
cout << "رنگ مورد علاقه: قرمز" << endl;
break;
case Sabz:
cout << "رنگ مورد علاقه: سبز" << endl;
break;
case Abi:
cout << "رنگ مورد علاقه: آبی" << endl;
break;
default:
cout << "رنگ نامشخص" << endl;
}
cout << "مقدار عددی سبز: " << rangFav << endl;
return 0;
}
در این مثال، ENUM به نام 'Rang' سه مقدار تعریف میکند: Ghermez، Sabz و Abi. ENUM بدون محدودیت باعث میشود نامها به صورت عمومی در دسترس باشند. متغیر 'rangFav' با Sabz مقداردهی شده است که نحوه اختصاص و ایمنی نوع پایه را نشان میدهد.
ساختار switch-case هر مقدار ENUM را پردازش میکند که برای منوها، وضعیتها یا گزینههای تنظیمات مناسب است. نمایش مقدار عددی به شما اجازه میدهد از ENUMها در محاسبات یا ذخیرهسازی استفاده کنید. برای پروژههای بزرگتر، توصیه میشود از ENUMهای محدود (enum class) استفاده شود تا امنیت نوع افزایش یابد و از تداخل نامها جلوگیری شود. همچنین، ENUMها میتوانند با آرایهها و بردارها ترکیب شوند تا مدیریت مجموعههای وضعیت یا دستهبندیها سادهتر شود.
مثال کاربردی
text\#include <iostream>
\#include <vector>
using namespace std;
// ENUM محدود (scoped)
enum class LevelLog { Info = 1, Ehtemal = 2, Khatarnak = 3 };
class Logger {
public:
void log(LevelLog level, const string& message) {
switch(level) {
case LevelLog::Info:
cout << "\[Info]: " << message << endl;
break;
case LevelLog::Ehtemal:
cout << "\[Warning]: " << message << endl;
break;
case LevelLog::Khatarnak:
cout << "\[Error]: " << message << endl;
break;
}
}
void processLogs(const vector<LevelLog>& logs) {
for(auto level : logs) {
log(level, "در حال پردازش لاگ...");
}
}
};
int main() {
Logger appLogger;
vector<LevelLog> logs = { LevelLog::Info, LevelLog::Ehtemal, LevelLog::Khatarnak, LevelLog::Info };
appLogger.processLogs(logs);
return 0;
}
در این مثال پیشرفته، ENUM 'LevelLog' محدود است، بنابراین از تداخل نامها و تبدیل ضمنی جلوگیری میکند. هر مقدار دارای یک عدد صریح است. کلاس Logger با استفاده از OOP طراحی شده است: متد log هر سطح را پردازش میکند و processLogs بر یک بردار از لاگها تکرار میشود.
این الگو از بهترین شیوهها پیروی میکند: ENUM محدود برای امنیت، switch کامل برای هر حالت، بدون استفاده از تخصیص دینامیک حافظه (اجتناب از نشت حافظه) و ترکیب با بردارها برای پردازش مجموعهای از وضعیتها. استفاده از ENUMها در OOP باعث افزایش مدولار بودن، خوانایی و اطمینان کد میشود.
بهترین شیوهها در استفاده از ENUMها شامل: ترجیح ENUMهای محدود (enum class) برای امنیت نوع، اختصاص مقادیر صریح هنگام نیاز، پردازش همه موارد در switch و جلوگیری از تبدیل ضمنی ناخواسته است. اشتباهات رایج شامل استفاده از ENUMهای عمومی در پروژههای بزرگ، حذف caseها در switch و تبدیلهای ضمنی که ممکن است باعث خطا شوند، است.
برای دیباگ، مقادیر ENUMها را بررسی کنید و از عملگرهای اسکوپ استفاده نمایید. برای بهینهسازی، نوع پایه مناسب انتخاب کنید. در برنامههای حساس، مقادیر ورودی از منابع خارجی باید اعتبارسنجی شوند تا امنیت حفظ شود. رعایت این شیوهها باعث افزایش ایمنی، کارایی و قابلیت نگهداری کد میشود.
📊 جدول مرجع
سیپلاسپلاس Element/Concept | Description | Usage Example |
---|---|---|
ENUM بدون محدودیت | در دسترس به صورت عمومی | enum Rang { Ghermez, Sabz, Abi }; |
ENUM محدود | جلوگیری از تداخل نامها و افزایش امنیت نوع | enum class LevelLog { Info, Ehtemal, Khatarnak }; |
مقدار صریح | تعیین مقدار عددی واضح | enum class Status { GheyreFaal=0, Faal=1, Tamoom=2 }; |
Switch با ENUM | کنترل جریان بر اساس ENUM | switch(level) { case LevelLog::Info: ... } |
ENUM در کلاس | محصور کردن ENUM در داخل کلاس | class Logger { enum class LevelLog { Info, Ehtemal, Khatarnak }; }; |
نوع پایه | بهینهسازی حافظه | enum class ErrorCode : uint8_t { Hich, Kam, Shadid }; |
یادگیری ENUMها به شما امکان میدهد مجموعههای ثابت مقادیر را به صورت واضح مدیریت کنید، خوانایی و نگهداری کد را افزایش دهید. ENUMها برای وضعیتها، لاگها، تنظیمات و الگوریتمها حیاتی هستند. ادغام با OOP باعث افزایش مدولار بودن و قابلیت استفاده مجدد کد میشود.
گامهای بعدی شامل مطالعه ساختارهای داده پیشرفته، templateها و ویژگیهای مدرن سیپلاسپلاس مانند constexpr و strong typing است. با آرایهها، بردارها و switch در ENUMهای محدود پروژههای بزرگ بسازید. منابع پیشنهادی: مستندات رسمی سیپلاسپلاس، کتابهای بهترین شیوهها و تمرینهای عملی.
🧠 دانش خود را بیازمایید
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود