Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Initialisation d'objet membre

3 réponses
Avatar
Frédéric Mayot
Bonjour,

Voici le problème :

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 ?

Merci.

Fred

3 réponses

Avatar
Fabien LE LEZ
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 ?

--
;-)

Avatar
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

Avatar
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