سؤال

في C ++، لدي إشارة إلى كائن تريد الرجوع إلى مالكه، لكنني لا أستطيع تعيين المؤشر أثناء إنشاء الفئة المحتوية لأنها لم تنتهك. لذلك أنا أحاول أن أفعل شيئا مثل هذا:

class A {
   public:

     A() : b(this) {}
   private:
     B b;
};

class B {
   public:
     B(A* _a) : a(_a) {}
   private:
     A* a;
};

هل هناك طريقة للتأكد من أن B دائما تتم تهيئتها مع أ * دون عقد مؤشر إلى ب؟

شكرا

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

المحلول

جرب هذا:

class A;

class B {
public:
  B(A *_a) : a(_a) {};

private:
  A* a;
};

class A {
public:
  A() : b(this) {};

private:
  B b;

};

نظرا لأن B موجود بالكامل في أ، يجب أن يتم الإعلان عنه أولا. يحتاج إلى مؤشر إلى A، لذلك عليك إعادة توجيه إشعال أ "قبل أن تعلن ب"

يتجمع هذا الرمز تحت إصدارات أكثر أو أقل من G ++.

نصائح أخرى

في C ++، لدي إشارة إلى كائن تريد الرجوع إلى مالكه، لكنني لا أستطيع تعيين المؤشر أثناء إنشاء الفئة المحتوية لأنها لم تنتهك.

يمكنك تخزين المؤشر بخير.

ما لا يمكنك القيام به هو محاولة الوصول إلى أعضاء / طرق من خلال المؤشر في منشئ B، حيث قد لا تتم تهيئة المثيل الأصل بالكامل عند هذه النقطة:

#include <iostream>

class Y;

class X
{
    Y* y;
public:
    X(Y* y);
};

class Y
{
    X x;
    int n;
public:
    Y(): x(this), n(42) {}
    int get_n() const { return n; }
};

X::X(Y* p): y(p)
{
    //Now this is illegal:
    //as it is, the n member has not been initialized yet for parent
    //and hence get_n will return garbage
    std::cout << p->get_n() << '\n';
}

int main()
{
    Y y;
}

إذا كنت قد قمت بالتبديل حول الأعضاء في y، فسيحصل N "إذن n" أولا، أن منشئ X سيقوم بطباعة 42، لكن هذا هش للغاية لتعتمد عليه.

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