PDA

View Full Version : سوال: شمارشگرهای همنام



yazdani0583
دوشنبه 03 فروردین 1394, 16:07 عصر
شمارشگرهاي هم‌نام نبايد در محدوده‌هاي مشترک استفاده شوند. براي مثال تعريف‌هاي زير را در نظر بگيريد:
enum Score{A,B,C,D}
enum Group{AB,B,BC} دو تعريف بالا غيرمجاز است زيرا شمارشگر B در هر دو تعريف Score و Group آمده است.علتش چیه؟

rahnema1
دوشنبه 03 فروردین 1394, 20:29 عصر
سلام
دو نوع enumeration داریم:
1 - حوزه دار scoped
2- بدون حوزه unscoped
این enum ها که شما تعریف کردید unscoped هستند که اعضای اونها یعنی شمارنده ها در حوزه ای تعریف می شوند که کل enum را در بر می گیره

enum Score{A,B,C,D};
enum Group{AB,B,BC};
int main(){}

مثلا اینجا B در فضای نام سراسری تعریف می شه و در کل این فضای نام (بعد از نقطه ای که تعریف میشه) قابل دسترسی هست
اما نوع حوزه دار به این صورت تعریف میشه

#include <iostream>
using namespace std;
enum struct Score{B,C,D};
enum struct Group{AB,B,BC};

int main()
{

cout<< (int)Score::B << endl;
cout<< (int)Group::B << endl;
}

در اینجا حوزه تعریف شمارنده ها فقط داخل فضای enum هست ( نه فضای نام سراسری) به همین خاطر برای دسترسی به اعضا از :: استفاده می کنیم
همچنین می شه به جای struct از کلمه class هم استفاده کنیم

chikar
دوشنبه 03 فروردین 1394, 21:21 عصر
بد نیست حالا که تاپیکی راجع به enum ساخته شده، من هم سوالی راجع به enum بپرسم!
بسیاری جاها مقدار دهی اعضای enum به این شکل انجام می شه
0x00
0x01
0x02
0x03
این مقادیر اصلا چرا استفاده می شه؟ و چه مفهومی داره؟
به عبارت دیگه این روش مقدار دهی چه مزیتی نسبت به روش معمولی داره؟
مرسی

rahnema1
دوشنبه 03 فروردین 1394, 21:36 عصر
بد نیست حالا که تاپیکی راجع به enum ساخته شده، من هم سوالی راجع به enum بپرسم!
بسیاری جاها مقدار دهی اعضای enum به این شکل انجام می شه
0x00
0x01
0x02
0x03
این مقادیر اصلا چرا استفاده می شه؟ و چه مفهومی داره؟
به عبارت دیگه این روش مقدار دهی چه مزیتی نسبت به روش معمولی داره؟
مرسی

اگه منظورتون اینه که چرا به صورت hex میذارن در این تاپیک (http://barnamenevis.org/showthread.php?448879) هم بحث شده:

chikar
دوشنبه 03 فروردین 1394, 23:41 عصر
enum struct Score{B,C,D};
enum struct Group{AB,B,BC};



نمی دونم چرا از این روشی که گذاشتید، کامپایلرم به من خطا می ده،از کلاس هم استفاده کردم فایده ای نداشت
برای تفکیک حوزه فقط به این شکل جواب می ده!

namespace my_enum
{
enum Score{A,B,C,D};
}
namespace my_enum2
{
enum Score{A,B,C,D};
}
int main()
{
cout << my_enum::C;
}


حالا مشکل کجاست از کامپایلر من (vs2010) یا جای دیگه؟
قسمتی از خطاها

unexpected 'struct' 'score'. Did you forget a ';'?
'score' : assembly access specifiers are only available in code compiled with a /clr option
missing type specifier - int assumed. Note: C++‎‎‎ does not support default-int
و ...

rahnema1
سه شنبه 04 فروردین 1394, 08:40 صبح
از نسخه 2013 استفاده کنید. فکرکنم دیگه 2010 منسوخ شده باشه چون از خیلی قابلیتهای c++11 پشتیبانی نمی کنه
gcc هم خوبه

chikar
سه شنبه 04 فروردین 1394, 11:46 صبح
از نسخه 2013 استفاده کنید. فکرکنم دیگه 2010 منسوخ شده باشه چون از خیلی قابلیتهای C++‎‎‎‎11 پشتیبانی نمی کنه
gcc هم خوبه
بله در gcc تست کردم به خوبی جواب می ده ، داخل vs2013 هم تست کردم بدون هیچ مشکلی جواب داد / مرسی