نوع Enumerated (Enumeration) یک نوع داده تعریف شده توسط کاربر است که می توان مقادیر محدودی را به آن اختصاص داد. این مقادیر در زمان اعلام نوع شمارش شده توسط برنامه نویس تعریف می شوند.
اگر مقدار float را در یک مقدار کاراکتر اختصاص دهیم، کامپایلر یک خطا ایجاد می کند. به همین ترتیب اگر بخواهیم مقدار دیگری را به انواع داده های شمارش شده اختصاص دهیم، کامپایلر یک خطا ایجاد می کند. انواع مقادیر شمارشگر به عنوان شمارشگر نیز شناخته می شوند. همچنین با صفر مشابه آرایه اختصاص داده می شود. همچنین می تواند با دستورات سوئیچ استفاده شود.
به عنوان مثال: اگر یک متغیر جنسیت با مقدار مرد یا زن ایجاد شود. اگر مقدار دیگری غیر از نر یا ماده به آن اختصاص داده شود، مناسب نیست. در این شرایط، می توان نوع برشماری شده را که در آن فقط مقادیر مذکر و مؤنث اختصاص داده می شود، اعلام کرد.
enum enumerated-type-name{value1, value2, value3…..valueN};
کلمه کلیدی enum برای اعلان انواع شمارش شده بعد از نوشتن نام نوع شمارش شده استفاده می شود و در زیر براکت ها مقادیر ممکن تعریف می شود. پس از تعریف متغیرهای نوع Enumerated ایجاد می شود. می توان آن را در دو نوع ایجاد کرد:
می توان آن را در حین اعلان انواع شمارش شده اعلام کرد، فقط نام متغیر را قبل از نقطه ویرگول اضافه کنید. یا،
علاوه بر این، می توانیم متغیرهای نوع برشماری شده را همانند متغیرهای عادی ایجاد کنیم.
به طور پیش فرض، مقدار کد شروع اولین عنصر enum 0 است (مانند مورد آرایه). اما می توان آن را به صراحت تغییر داد.
enum enumerated-type-name{value1=1, value2, value3};
مقادیر متوالی enum مجموعه بعدی مقادیر را خواهند داشت.
enum first_enum{value1=1, value2=10, value3};
In this case,
first_enum e;
e=value3;
cout<<e;
Output:
11
یک مثال دیگر:
#include <bits/stdc++.h>
using namespace std;
int main()
{
// Defining enum Gender
enum Gender { Male, Female };
// Creating Gender type variable
Gender gender = Male;
switch (gender)
{
case Male:
cout << "Gender is Male";
break;
case Female:
cout << "Gender is Female";
break;
default:
cout << "Value can be Male or Female";
}
return 0;
}
اما این نوع از تعریف enum مشکلاتی هم ایجاد می کنه که توجه شما را به مثال های زیر جلب می کنم:
#include <bits/stdc++.h>
using namespace std;
int main()
{
// Defining enum1 Gender
enum Gender { Male,
Female };
// Defining enum2 Gender2 with same values
// This will throw error
enum Gender2 { Male,
Female };
// Creating Gender type variable
Gender gender = Male;
Gender2 gender2 = Female;
cout << gender << endl
<< gender2;
return 0;
}
خطای کامپایل :
prog.cpp:13:20: error: redeclaration of 'Male'
enum Gender2 { Male,
^
prog.cpp:8:19: note: previous declaration 'main()::Gender Male'
enum Gender { Male,
^
prog.cpp:14:20: error: redeclaration of 'Female'
Female };
^
prog.cpp:9:19: note: previous declaration 'main()::Gender Female'
Female };
^
prog.cpp:18:23: error: cannot convert 'main()::Gender'
to 'main()::Gender2' in initialization
Gender2 gender2 = Female;
^
که برای این مشکل در c++11 اومدن و enum class(که به آنها scoped enumerations نیز گفته میشود) را معرفی کردن که مشکلات بالا را نداشته باشیم.
Class enum اجازه تبدیل ضمنی به int را نمی دهد و همچنین شمارشگرها را از enumerations مختلف مقایسه نمی کند.
برای تعریف کلاس enum از کلمه کلیدی class بعد از کلمه کلیدی enum استفاده می کنیم.
مثال :
#include <iostream>
using namespace std;
int main()
{
enum class Color { Red,
Green,
Blue };
enum class Color2 { Red,
Black,
White };
enum class People { Good,
Bad };
// An enum value can now be used
// to create variables
int Green = 10;
// Instantiating the Enum Class
Color x = Color::Green;
// Comparison now is completely type-safe
if (x == Color::Red)
cout << "It's Red\n";
else
cout << "It's not Red\n";
People p = People::Good;
if (p == People::Bad)
cout << "Bad people\n";
else
cout << "Good people\n";
// gives an error
// if(x == p)
// cout<<"red is equal to good";
// won't work as there is no
// implicit conversion to int
// cout<< x;
cout << int(x);
return 0;
}
خروجی:
It's not Red
Good people
1
در ضمن enum class می تونن هر نوع داده ی عددی همانند char, short or unsigned int همه داشته باشند.
که به صورت زیر می توان از آن استفاده کرد:
#include <iostream>
using namespace std;
enum rainbow{
violet,
indigo,
blue,
green,yellow,orange,red
}colors;
enum class eyecolor:char{
blue,green,brown
}eye;
int main() {
cout<<"size of enum rainbow variable: "<<sizeof(colors)<<endl;
cout<<"size of enum class eyecolor variable:"<<sizeof(eye)<<endl;
return 0;
}
خروجی:
size of enum rainbow variable: 4
size of enum class eyecolor variable:1