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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top