C ++ se référant à un objet en cours de construction
-
12-09-2019 - |
Question
En C ++ j'ai une référence à un objet qui veut pointer à son propriétaire, mais je ne peux pas régler le pointeur lors de la construction de la classe contenant parce que son pas fait construire. Donc, je suis en train de faire quelque chose comme ceci:
class A {
public:
A() : b(this) {}
private:
B b;
};
class B {
public:
B(A* _a) : a(_a) {}
private:
A* a;
};
Y at-il un moyen d'assurer B obtient toujours initialisé avec A * sans A contenant un pointeur à B?
Merci
La solution
Essayez ceci:
class A;
class B {
public:
B(A *_a) : a(_a) {};
private:
A* a;
};
class A {
public:
A() : b(this) {};
private:
B b;
};
Puisque B est entièrement contenue dans A, il doit être déclaré en premier. Il a besoin d'un pointeur vers A, donc vous devez avant-Déclarez une avant de déclarer B.
Ce code compile sous les versions actuelles plus ou moins de g ++.
Autres conseils
En C ++ j'ai une référence à un objet qui veut pointer à son propriétaire, mais je ne peux pas régler le pointeur lors de la construction de la classe contenant parce que sa construction ne se fait pas.
Vous pouvez stocker le pointeur bien.
Ce que vous ne pouvez pas faire est d'essayer d'obtenir aux membres / méthodes de A travers le pointeur dans le constructeur de B, puisque l'instance mère pourrait ne pas être complètement initialisé au point:
#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;
}
Si vous deviez changer autour des membres en Y, donc n obtiendriez initialisé d'abord, le constructeur de X imprimera 42, mais qui est trop fragile à dépendre.