enum class یا enum - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

enum class یا enum

+3 امتیاز
129 بازدید

سلام.

بعضی از دوستام با استاد بحث می کردن می گفتند که باید از enum class استفاده کنیم استاد ما می گفت enum خوبه ما نفهمیدم کدوم استفاده کنیم/

سوال شده آذر 3, 1392  بوسیله ی toopak (امتیاز 375)   3 8 51

2 پاسخ

+5 امتیاز
 
بهترین پاسخ

enum خالی متاسفانه scope نداشت و بعی اوقات اسامی با هم conflict می کرد ولی در enum class به این صورت نیست.

در ضمن برای enum class شما می تونید نوع هم در نظر بگیرید.

enum class Color{RED,GREEN,BLUE};

enum class Alphabet:char{A,B,C};

در ضمن enum class را به مقادیر عددی نیز می تونید cast کنید.

enum class ها در ضمن type safe هستند یعنی وقتی که به عنوان پارامترهای یک تابع در نظرشون می گیرید دیگه هر چیزی رو نمی تونید به آن پارامتر پاس بدید که میزان خطاهای منطقی کد را کاهش میده.

پاسخ داده شده آذر 3, 1392 بوسیله ی مصطفی ساتکی (امتیاز 16,378)   16 24 66
+2 امتیاز

معایب 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  )

 

 

پاسخ داده شده بهمن 13, 1392 بوسیله ی BlueBlade (امتیاز 15,712)   13 16 85
...