سؤال

لدي فئة تحتوي على مؤشر (غير ذكي) لكائن واجهة (دعنا نسميها pInterface) وأنا أقوم بإنشاء فئة متداخلة تحتاج أيضًا إلى الوصول إلى تلك الواجهة.سأقوم بالتغلب على هذا عن طريق تمرير المؤشر إلى الواجهة إلى مُنشئ الفئة المتداخلة كما يلي:

CNestedClass someClass( pInterface, ... );

ومع ذلك فأنا غير متأكد من أفضل طريقة لتخزين هذا المؤشر في الفئة المتداخلة.يمكن أن أستخدم:

1) A scoped (or other smart) pointer (to the original object)
2) A pointer to a pointer 

ماذا تقترحون يا رفاق ولماذا؟

يحرر:يجب أن أوضح - ستحتاج الفئة المتداخلة إلى استدعاء الأساليب على كائن الواجهة، ولكنها لا تقوم بإنشائها (أو تعديل الكائن "المشار إليه")، والفئة الأصلية هي المسؤولة عن ذلك.

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

المحلول

يتم استخدام مؤشر لمؤشر إذا كان أي من الفئتين قد يغير قيمة المؤشر - على سبيل المثال.عن طريق حذف الكائن الموجود واستبداله بكائن جديد.يسمح هذا لكلا الفئتين بمواصلة استخدام نفس الكائن عن طريق إلغاء الإشارة إلى المؤشر.

إذا لم يكن ما يهمك هو ضمان بقاء الكائن صالحًا طوال عمر كلا الفئتين.

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

إذا كنت بحاجة إلى التأكد من عمر الكائن، فيمكن القيام بذلك عبر دلالات العد المرجعي، إما يدويًا أو من خلال واجهة المؤشر الذكي.

للحصول على مؤشر ذكي، سيكون Boost::shared_ptr خيارًا جيدًا.Shared_ptr يسمح بمشاركة ملكية الكائن بمقدار مؤشرات متعددة.عندما يخرج Shared_ptr الأخير عن النطاق، يتم حذف الكائن.

(لاحظ أن هذا ليس هو الحال مع auto_ptr، حيث يكون الكائن مملوكًا حصريًا).

أشياء يجب أن تكون على علم بها؛

  1. عند استخدام Boost::shared_ptr تأكد من أن الفئة المتداخلة تحتوي على ينسخ من Shared_ptr وليس مرجعًا/مؤشرًا.
  2. يتصرف std::auto_ptr بشكل مختلف تمامًا، فالكائنات مملوكة حصريًا وليست مشتركة
  3. يمكن أن يعمل Boost::shared_ptr فقط مع كائنات الكومة، على سبيل المثال المؤشرات التي تم إرجاعها من استدعاء إلى "جديد"

مثال:

typedef boost::shared_ptr<Interface> shared_interface;

class NestedClass
{
  shared_interface mInterface; // empty pointer
}

void NestedClass::setInterface(shared_interface& foo)
{
  mInterface= foo; // take a copy of foo.
}

void ParentClass::init( void )
{
  // mInterface is also declared as shared_interface
  mInterface = new Interface();
  mNestedClass->setInterface(mInterface);
}

نصائح أخرى

والسبب الآخر قد ترغب في استخدام مؤشر إلى مؤشر سيكون إذا كان <م> الخارجية كود قد تغير قيمة المؤشر الأصلي (على سبيل المثال جعله يشير إلى كائن جديد، أو تعيينها إلى NULL بعد الإفراج عن الكائن يشير إلى). ومع ذلك، IMO هو ممارسة سيئة جدا لتغيير المؤشر بعد إعطائه لشخص آخر.

وهكذا، إذا كان لا رمز الخارجي ولا فئة متداخلة يتغير المؤشر، مجرد تخزينه في فئة متداخلة كنسخة المؤشر الأصلي كما متغير عضو (حقل).

وتمرير في عنوان مؤشر إلى واجهة الخاص بك (IMyInterface ** ppInterface)، وملء مؤشر إذا تم تنفيذه من قبل الطبقة.

والطبقة يمكن أن يلقي في هذا المؤشر إلى تلك الواجهة وملء مؤشر * ppInterface. إذا لم الطبقة تنفيذ هذه الواجهة فإنه يمكن تعيين * ppInterface إلى NULL.

وأساسا، كنت تشارك مؤشر إلى نفس الكائن بين كائنين مختلفة. إذا كنت لا تستخدم أي مؤشرات الذكية، وذلك ببساطة تخزين المؤشر إلى كائن المشتركة. يجب أن تكون حذرا حول ملكية الكائن المشترك، أي الكائن الذي هو المسؤول عن إلغاء تخصيص الكائن المشترك وإخطار البعض الآخر أنه ذهب.

class Outer
{
    class Inner
    {
    };
};

نظرًا لأن كائن Outer يحمل فقط مؤشر RAW لكائن pInterface، فهذا يعني أن الكائن الخارجي لا يمتلك أو يتحكم في عمر كائن pInterface.لذلك نأمل أن يكون هناك بعض الضمان بأن كائن pInterface سيعيش بنفس عمر الكائن الخارجي؛في هذه الحالة لا يوجد سبب لاستخدام مؤشر، يمكنك فقط استخدام مرجع (بافتراض عدم وجود موقف يجعل pInterface NULL).

تعتمد كيفية احتفاظ Inner بـ "مرجعه" (وليس مرجع C++) ونحتاج حقًا إلى مزيد من المعلومات حول العلاقة بين الكائنات المعنية!

  • ما هي العلاقة بين الأشياء الداخلية والخارجية.
  • ما هو عمر الكائن الداخلي بالنسبة للكائن الخارجي الذي ورث منه مؤشر pInterface؟
  • ما هو الضمان بأن عمر الكائن الخارجي أقصر من عمر كائن pInterface.

إلخ.

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