سؤال

هل هناك أي طريقة لإعلان كائن من فئة قبل إنشاء الفئة في C++؟أسأل لأنني أحاول استخدام فئتين، يحتاج الأول إلى وجود مثيل للفئة الثانية داخله، ولكن يحتوي الفصل الثاني أيضًا على مثيل للفئة الأولى.أدرك أنك قد تعتقد أنني قد أدخل في حلقة لا نهائية، ولكنني في الواقع بحاجة إلى إنشاء ومثيل للفئة الثانية قبل الفئة الأولى.

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

المحلول

لا يمكنك أن تفعل شيئا مثل هذا:

class A {
    B b;
};
class B {
    A a;
};

المشكلة الأكثر وضوحًا هي أن المترجم لا يعرف كيفية تكبير الفئة A، لأن حجم B يعتمد على حجم A!

ومع ذلك، يمكنك القيام بذلك:

class B; // this is a "forward declaration"
class A {
    B *b;
};
class B {
    A a;
};

يتيح لك الإعلان عن الفئة B كإعلان أمامي استخدام المؤشرات (والمراجع) لتلك الفئة دون الحصول على تعريف الفئة بالكامل.

نصائح أخرى

لا يمكنك الإعلان عن مثيل لفئة غير محددة ولكن يمكنك الإعلان عن مثيل المؤشر إلى واحد:

class A;  // Declare that we have a class A without defining it yet.

class B
{
public:
    A *itemA;
};

class A
{
public:
    B *itemB;
};

هناك حل أنيق باستخدام القوالب.

template< int T > class BaseTemplate {};
typedef BaseTemplate< 0 > A;
typedef BaseTemplate< 1 > B;
// A
template<> class BaseTemplate< 0 >
{
public:
   BaseTemplate() {} // A constructor
   B getB();
}

// B
template<> class BaseTemplate< 1 >
{
public:
   BaseTemplate() {} // B constructor
   A getA();
}

inline B A::getB() { return A(); }
inline A B::getA() { return B(); }

هذا الرمز سوف يعمل!فلماذا يعمل؟السبب يتعلق بكيفية تجميع القوالب.تأخير القوالب إنشاء توقيعات الوظائف حتى تستخدم القالب بالفعل في مكان ما.هذا يعني أنه لن يتم تحليل توقيعات GETA () أو GETB () إلا بعد إعلان كلتا الفئتين A و B بالكامل.هذا هو سحر هذه الطريقة.

هل هذا قريب مما تريد:تحتوي الفئة الأولى على الفئة الثانية، لكن الفئة الثانية (التي سيتم إنشاؤها أولاً) تحتوي فقط على إشارة إلى الفئة الأولى؟

وهذا ما يسمى الإسناد الترافقي.يرى هنا مثال.

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