B contient une instance de A et doit lors de sa création diffusé son
adresse à a. Le problème est que je ne dois pas avoir accès à this dans
la liste d'initialisation (là où j'ai placé les ???).
Dois-je obligatoirement créer un set_b dans ma classe A et l'appeler
dans le constructeur de B ou y a-t-il une autre méthode ?
On Thu, 06 Nov 2003 23:02:30 +0100, Frédéric Mayot wrote:
Le problème est que je ne dois pas avoir accès à this dans la liste d'initialisation
Pourquoi ?
-- ;-)
Christophe Lephay
Frédéric Mayot wrote:
class A { B* b;
A(B* p) : b(p) {} };
class B { A a;
B() : a(???) {} };
B contient une instance de A et doit lors de sa création diffusé son adresse à a. Le problème est que je ne dois pas avoir accès à this dans la liste d'initialisation (là où j'ai placé les ???).
Dois-je obligatoirement créer un set_b dans ma classe A et l'appeler dans le constructeur de B ou y a-t-il une autre méthode ?
Lors de l'appel du constructeur, la mémoire a été allouée, ce qui signifie que l'adresse de this est valide. Ce que tu ne peux pas faire, c'est appeler des fonctions virtuelles et t'attendre à ce que ce soient les versions des classes dérivées qui soient appelées :
B() : a( this ) {} est valide
struct B : public A { B() { fonction(); } virtual fonction(); };
struct C : B { fonction(); };
Ici, tu peux appeler fonction() dans B, ce sera B::fonction() qui sera appelée et non C::fonction()...
Chris
Frédéric Mayot wrote:
class A
{
B* b;
A(B* p) : b(p) {}
};
class B
{
A a;
B() : a(???) {}
};
B contient une instance de A et doit lors de sa création diffusé son
adresse à a. Le problème est que je ne dois pas avoir accès à this
dans la liste d'initialisation (là où j'ai placé les ???).
Dois-je obligatoirement créer un set_b dans ma classe A et l'appeler
dans le constructeur de B ou y a-t-il une autre méthode ?
Lors de l'appel du constructeur, la mémoire a été allouée, ce qui signifie
que l'adresse de this est valide. Ce que tu ne peux pas faire, c'est appeler
des fonctions virtuelles et t'attendre à ce que ce soient les versions des
classes dérivées qui soient appelées :
B() : a( this ) {} est valide
struct B : public A
{
B() { fonction(); }
virtual fonction();
};
struct C : B
{
fonction();
};
Ici, tu peux appeler fonction() dans B, ce sera B::fonction() qui sera
appelée et non C::fonction()...
B contient une instance de A et doit lors de sa création diffusé son adresse à a. Le problème est que je ne dois pas avoir accès à this dans la liste d'initialisation (là où j'ai placé les ???).
Dois-je obligatoirement créer un set_b dans ma classe A et l'appeler dans le constructeur de B ou y a-t-il une autre méthode ?
Lors de l'appel du constructeur, la mémoire a été allouée, ce qui signifie que l'adresse de this est valide. Ce que tu ne peux pas faire, c'est appeler des fonctions virtuelles et t'attendre à ce que ce soient les versions des classes dérivées qui soient appelées :
B() : a( this ) {} est valide
struct B : public A { B() { fonction(); } virtual fonction(); };
struct C : B { fonction(); };
Ici, tu peux appeler fonction() dans B, ce sera B::fonction() qui sera appelée et non C::fonction()...
Chris
kanze
"Christophe Lephay" wrote in message news:<bof6bf$3k2$...
Frédéric Mayot wrote:
class A { B* b;
A(B* p) : b(p) {} };
class B { A a;
B() : a(???) {} };
B contient une instance de A et doit lors de sa création diffusé son adresse à a. Le problème est que je ne dois pas avoir accès à this dans la liste d'initialisation (là où j'ai placé les ???).
Dois-je obligatoirement créer un set_b dans ma classe A et l'appeler dans le constructeur de B ou y a-t-il une autre méthode ?
Lors de l'appel du constructeur, la mémoire a été allouée, ce qui signifie que l'adresse de this est valide. Ce que tu ne peux pas faire, c'est appeler des fonctions virtuelles et t'attendre à ce que ce soient les versions des classes dérivées qui soient appelées :
Ce n'est pas tout ce que tu ne peux pas faire. Des conversions de Derived* vers Base* ne sont pas garanties non plus. Dans son cas, pas de problème, mais si on ajoutait une classe D :
class D : public B { A a public: D() : a( this ) {} } ;
on a un comportement indéfini.
B() : a( this ) {} est valide
A condition que le type auquel s'attend le constructeur de a est bien B*, et non un pointeur vers une base de B.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
"Christophe Lephay" <christophe-lephay@wanadoo.fr> wrote in message
news:<bof6bf$3k2$1@news-reader5.wanadoo.fr>...
Frédéric Mayot wrote:
class A
{
B* b;
A(B* p) : b(p) {}
};
class B
{
A a;
B() : a(???) {}
};
B contient une instance de A et doit lors de sa création diffusé son
adresse à a. Le problème est que je ne dois pas avoir accès à this
dans la liste d'initialisation (là où j'ai placé les ???).
Dois-je obligatoirement créer un set_b dans ma classe A et l'appeler
dans le constructeur de B ou y a-t-il une autre méthode ?
Lors de l'appel du constructeur, la mémoire a été allouée, ce qui
signifie que l'adresse de this est valide. Ce que tu ne peux pas
faire, c'est appeler des fonctions virtuelles et t'attendre à ce que
ce soient les versions des classes dérivées qui soient appelées :
Ce n'est pas tout ce que tu ne peux pas faire. Des conversions de
Derived* vers Base* ne sont pas garanties non plus. Dans son cas, pas de
problème, mais si on ajoutait une classe D :
class D : public B
{
A a
public:
D() : a( this ) {}
} ;
on a un comportement indéfini.
B() : a( this ) {} est valide
A condition que le type auquel s'attend le constructeur de a est bien
B*, et non un pointeur vers une base de B.
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
"Christophe Lephay" wrote in message news:<bof6bf$3k2$...
Frédéric Mayot wrote:
class A { B* b;
A(B* p) : b(p) {} };
class B { A a;
B() : a(???) {} };
B contient une instance de A et doit lors de sa création diffusé son adresse à a. Le problème est que je ne dois pas avoir accès à this dans la liste d'initialisation (là où j'ai placé les ???).
Dois-je obligatoirement créer un set_b dans ma classe A et l'appeler dans le constructeur de B ou y a-t-il une autre méthode ?
Lors de l'appel du constructeur, la mémoire a été allouée, ce qui signifie que l'adresse de this est valide. Ce que tu ne peux pas faire, c'est appeler des fonctions virtuelles et t'attendre à ce que ce soient les versions des classes dérivées qui soient appelées :
Ce n'est pas tout ce que tu ne peux pas faire. Des conversions de Derived* vers Base* ne sont pas garanties non plus. Dans son cas, pas de problème, mais si on ajoutait une classe D :
class D : public B { A a public: D() : a( this ) {} } ;
on a un comportement indéfini.
B() : a( this ) {} est valide
A condition que le type auquel s'attend le constructeur de a est bien B*, et non un pointeur vers une base de B.
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16