C ++ في اشارة الى كائن يجري بناؤه
-
12-09-2019 - |
سؤال
في 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، لكن هذا هش للغاية لتعتمد عليه.