J'ai deux classes avec une relation parent-enfant (la classe Parent
classe "has-a" Child
), et la Child
a un pointeur vers la classe Parent
. Il serait bien d'initialiser le pointeur du parent lors de la construction de l'enfant, comme suit :
class Child;
class Parent;
class Child
{
public:
Child (Parent* parent_ptr_) : parent_ptr(parent_ptr_) {};
private:
Parent* parent_ptr;
};
class Parent
{
public:
Parent() : child(this) {};
private:
Child child;
}
Maintenant, je sais que les gens recommandent de ne pas utiliser this
dans la liste d'initialisation, et FAQ C++ dit que je vais avoir un avertissement du compilateur (BTW, sous VS2010, je n'ai pas d'avertissement), mais j'aime vraiment mieux cela que d'appeler une fonction set dans Parent
Le constructeur de l'entreprise. Mes questions sont les suivantes :
- Est-ce que le parent
this
bien défini lorsque leChild
est en train d'être créé ? - Si oui, pourquoi est-il considéré comme une mauvaise pratique de l'utiliser comme ci-dessus ?
Merci,
Boaz
EDIT : Merci Timbo, c'est en effet un duplicate (hein, j'ai même choisi les mêmes noms de classe). Alors, apportons une valeur ajoutée : qu'en est-il des références ? Est-il possible / sûr de faire ce qui suit ? :
class Child
{
public:
Child (Parent& parnet_ptr_) : parent_ptr(parent_ptr_) {};
private:
Parent* parent_ptr;
};
class Parent
{
public:
Parent() : child(*this) {};
private:
Child child;
}
0 votes
Duplicata possible de En C++, initialiser un membre de classe avec le pointeur 'this' pendant la construction.
0 votes
@thecoshman - jeu de mots ?
0 votes
Vs2010 produit effectivement un avertissement à ce sujet, cela dépend du niveau d'avertissement qui a été défini.