معایب enum :
نبود scope در enum
Enum Games{Taken,COD,Fast Five};
Enum Movies{Taken,Fast Five}//erro
این کد ارور redefinition of Taken ,Fast Five رو میده.
که برای حل این مشکل توی C++98 مجبور بودین از namespace یا چیزای دیگه استفاده کنین به این شکل
namespace Game {
enum Game {FastFive, BattleField, Taken};
}
namespace Movie {
enum Movie {FastFive,GodFather, Taken};
}
این کد هم باز تمام مشکلاتو حل نمی کرد
شما الان میتونین Movie رو با Game مقایسه کنین به این شکل !
if(Game::Game::Taken==Movie::Movie::Taken)
cout<<"OMG! Movie = Game in C++98
که برای حل این مشکل منطقی مجبور بودین enum رو توی کلاس تعریف کنین که تعداد خطوط کد برای این کار ساده خیلی زیاد میشد و خوانایی کد رو هم به شدت میاره پایین و بعضی مواقع سرعت اجرا رو هم میاره پایین !
در C++11 میتونین به جای استفاده ازenum معمولی که مشکلاتی مثل همون چیزی که گفتم داره از enum class استفاده کنین که مثل کلاس ها scope دارن برای مثال
enum class Game{FastFive, BattleField, Taken};
enum class {FastFive,GodFather, Taken};//bar khalaf enum in yeki error redifinition ro nemide
if(Game::Taken==Movie::Taken)//bar khalaf enum error no match for 'operator==' (operand types are 'Game' and 'Movie') mide va joloye compile ro migire
cout<<"In ghesmat hich vaght ejra nemishe";
همچنین توی enum class تبدیل از enum به integer نداریم که جلوی تعداد زیادی از مشکلات منطقی رو می گیره !
Game::Game game;//enum mamooli
if(game<100)//ok 100 ba game moghaiese mishe
cout<<"convert enum to int ! C++98";
Game gamec11;//enum class
if(gamec11>100)//error can not compare (hich vaght ejra nemishe )