سؤال

في برنامجي، لدي كائنات (من نفس الفئة) التي يجب أن يكون لها معرف فريد. بالنسبة للبساطة والأداء، اخترت استخدام عنوان الكائن كمعرف. والحفاظ على الأنواع بسيطة، وأنا استخدم (void*) كنوع لهذا المعرف. في النهاية لدي رمز مثل هذا:

class MyClass {
public:
  typedef void* identity_t;
  identity_t id() const { return (void*)this; }
}

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

ملاحظة: أنا متردد في استخدام (char*) لأن هذا يعني أن المستخدم يمكنه استخدام البيانات للنسخ، والذي لا يمكن!

هل كانت مفيدة؟

المحلول

أنت تنتهك الاستيقاد المنطقي عودة الكائن كقابلة للتغيير في طريقة CONST.
كما يشير نيل، لا يلزم وجود يلقي.

class MyClass {
public:
  typedef const void* identity_t;
  identity_t id() const { return this; }
};

نصائح أخرى

يمكنك محاولة استخدام النوع uintptr_t بدلا من void*. uintptr_t هو نوع عدد صحيح يعرف أنه كبير بما يكفي لعقد أي قيمة مؤشر. وبما أن الأمر ليس في الواقع مؤشر، فلن يذكر المحول البرمجي أي مشاكل في التعرجات.

class MyClass {
public:
    typedef uintptr_t identity_t;
    identity_t id() const { return (identity_t)this; }
}

جرب استخدام

return static_cast<void*>(this);

يجب أن يكون هذا آمنا تماما، يجب أن يكون أي مؤشر قادرا على الإدلاء void * دون خطر الخسارة.

اقترحت في الأصل dynamic_cast(this);, ، ولكن بعد القراءة قليلا، أعتقد أنه لا يضيف أي ميزة، وبما أن RTTI - فقط ليس حل جيد بشكل عام.

بالمناسبة، أود أن أجري القيمة التي تم إرجاعها const, ، لأن هوية كائن لا يمكن أن تتغير.

لا أستطيع أن أرى أي مشاكل في التعرجات. ومع ذلك، فأنت تبقى بعيدا الاستئصال (منذ id وظيفة هي const)، والتي قد يكون التحويل البرمجي غير راض عنها. ربما يكون من الأفضل استخدامه const void* كما نوع معرف الخاص بك.

بدلا من ذلك، يلقي العنوان إلى نوع عدد صحيح مثل size_t. وبعد ثم لم يعد مؤشرا، ويصبح التعرج غير مشكلة.

لماذا لا تستخدم النوع MyClass *?

أو اكتب intptr_t?

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