سؤال

لدي هذا التعداد:

enum ButtonState {
    BUTTON_NORMAL = 0,
    BUTTON_PRESSED = 1,
    BUTTON_CLICKED = 2
};

const u8 NUM_BUTTON_STATES = 3;

في زر الطبقة لدي الأعضاء المتغيرات ButtonState state; و ButtonColors colors[NUM_BUTTON_STATES];.عند رسم زر يمكنني استخدام colors[state] للحصول على ألوان لأي دولة الزر في.

أسئلتي:

  1. هل هذا جيد البرمجة النمط ؟ هل هناك طريقة أفضل للقيام بذلك ؟ (وعادة ما تستخدم فقط enums مع التبديل البيانات...باستخدام enum باعتبارها مؤشر مجموعة لا يشعر الحق.)
  2. لا لديك لتحديد قيم التعداد?يبدو أن يبدأ من 0 بشكل افتراضي زيادة بنسبة 1 لكن هل هو مضمون العمل بهذه الطريقة في كل compilers ؟
هل كانت مفيدة؟

المحلول

هل هذا جيد البرمجة النمط ؟

أعتقد ذلك.أنا أفعل نفس الشيء تماما في كثير من الأحيان.

هل هناك طريقة أفضل للقيام بذلك ؟

class Button
{
public:
    // Used for array indexes!  Don't change the numbers!
  enum State {
    NORMAL = 0,
    PRESSED,
    CLICKED,
    NUMBER_OF_BUTTON_STATES
  };
};

العيب هو أن NUMBER_OF_BUTTON_STATES هو الآن صالحة زر::الدولة القيمة.ليست مشكلة كبيرة إذا كنت تمر هذه القيم حول رجات.ولكن مشكلة إذا كنت فعلا أتوقع زر::الدولة.

باستخدام enum باعتبارها مؤشر مجموعة لا يشعر الحق.

لا بأس.فقط الوثيقة فإنه إذا الرجل يعرف ماذا يجري!(هذا ما تعليقات؟)

هل يجب تحديد قيم التعداد?

مع '=' المهمة ، enum هي من المفترض أن تبدأ من الصفر و زيادة صعودا.

إذا كان التعداد الدخول '=' تعيين القيمة ، اللاحقة غير '=' التعداد إدخالات مواصلة العد من هناك.

المصدر: المشروح C++ الدليل المرجعي, ص 113

أنه قال: أحب أن تحديد القيمة الأولية فقط لجعل الكود أكثر وضوحا.

نصائح أخرى

نعم سوف تعمل بشكل جيد.أنه قال: في أي حال ، حقا يجب وضع إدخال آخر في التعداد تحديد قيمة المبلغ من البنود:

enum ButtonState {
    BUTTON_NORMAL,
    BUTTON_PRESSED,
    BUTTON_CLICKED,
    STATE_COUNT
};

ثم يمكنك تحديد مجموعة مثل

Color colors[STATE_COUNT];

وإلا ستكون فوضى الحفاظ على كمية من الولايات متزامن مع حجم المصفوفة.والتعدادات دائما نبدأ من الصفر إذا لا خلاف تهيئة ثم كل دخول إضافية سيتم تعيين قيمة واحدة فوق سابقتها ، إذا لا خلاف تهيئة.بالطبع أيضا لا يضر إذا وضعت صفر صراحة إذا كنت تريد.إذا كنت لا تمانع في تعليمات برمجية إضافية ، أود أن التفاف الوصول إلى الخام المصفوفة باستخدام وظيفة مثل

Color & operator[](ButtonState state) {
    return array[state];
}

أو ما يعادلها getColor وظيفة إعادة توجيه الطلب.التي من شأنها أن تمنع مباشرة فهرسة مجموعة مع بعض صحيح ، التي من المؤكد أن في بعض نقطة تفشل بسبب واحد يحصل على مؤشرات الخطأ.

باستخدام enum هو موافق.ولكن لم يكن لديك لتحديد القيم لكل بند.يكفي أن تحديد القيمة الأولى.لا تفترض أن enums تبدأ من 0 ، لأنني قد استخدمت المجمعين التي تستخدم 1 قيمة البداية (وليس أجهزة الكمبيوتر ولكن بعض المجمعين على ميكروكنترولر بعض التصرفات الغريبة).أيضا, هل يمكن التخلص من const:

enum ButtonState {
    BUTTON_NORMAL = 0,
    BUTTON_PRESSED,
    BUTTON_CLICKED,
    NUM_BUTTON_STATES
};

السؤال 1:أعتقد أنه من الجيد أسلوب البرمجة.أنا استخدامها في كل وقت.السؤال 2:بقدر ما أعرف ، ويضمن أن العمل بهذه الطريقة حتى لا تضطر إلى تحديد القيم.

وأود أن وضع NUM_BUTTON_STATES في التعداد أيضا.

أسلوب الحكيم, انها على ما يرام.

باسكال اللغات مثل دلفي تسمح حدود مجموعة محددة مثل نوع التعداد ، لذلك يمكنك فقط استخدام العناصر من نوع معين كمؤشر.

فمن الطبيعي تماما أن استخدام التعداد الفهرسة في صفيف.

لم يكن لديك لتحديد كل التعداد القيمة ، سوف الاضافة تلقائيا من قبل 1.ترك المترجم اختيار القيم يقلل من إمكانية الطباعة وخلق علة, وإنما يحرم عليك من رؤية القيم, التي قد تكون مفيدة في التصحيح.

لا بأس, ولكن كنت تريد أن تفعل بعض حدود التدقيق على مجموعة ، كما لو كان شخص ما يضيف آخر ButtonState, سيكون لديك مشكلة.

أيضا عناصر من مجموعة الألوان هي ثابتة ، لذلك ربما ننظر في استخدام مجموعة مختلفة إلى مجموعة بحيث يمكنك فرض أن ثبات.ربما Dictionary<ButtonState,ButtonColor>

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top