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

passer son pointeur pendant sa creation?

5 réponses
Avatar
pasde.hcyrano.spam
bonjour,

comment creer un objet, qui crée d'autre objet en leur passant sa
reference?

du genre

constructeur :

maClass {
objet = new objet(this);
}


merci
--
Bruno Causse
http://perso.wanadoo.fr/othello

5 réponses

Avatar
pasde.hcyrano.spam
Bruno Causse wrote:

bonjour,

comment creer un objet, qui crée d'autre objet en leur passant sa
reference?

du genre

constructeur :

maClass {
objet = new objet(this);
}


merci


est il possible de passer "this" dans un constructeur?

--
Bruno Causse
http://perso.wanadoo.fr/othello

Avatar
Fabien LE LEZ
On Sat, 29 Apr 2006 13:00:41 +0200, (Bruno
Causse):

est il possible de passer "this" dans un constructeur?


Oui.

Avatar
James Kanze
Fabien LE LEZ wrote:
On Sat, 29 Apr 2006 13:00:41 +0200,
(Bruno Causse):


est il possible de passer "this" dans un constructeur?



Parfois. Une conversion implicite de this à un pointeur à un
type de base a un comportement indéfini :

struct Base {} ;
struct Tool { Tool( Base* owner ) ; } ;
struct Derived : Base
{
Tool myTool ;
Derived() : myTool( this ) {}
} ;

a un comportement indéfini (et ne marche pas dans certains cas,
avec certains compilateurs).

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Avatar
Fabien LE LEZ
On Sun, 30 Apr 2006 12:38:32 +0200, James Kanze :

est il possible de passer "this" dans un constructeur?



Parfois. Une conversion implicite de this à un pointeur à un
type de base a un comportement indéfini :


Tiens ? Quelle en est la cause ?

La partie "Base" est pourtant totalement construite quand on est dans
le corps du constructeur de "Derived", non ?



Avatar
James Kanze
Fabien LE LEZ wrote:
On Sun, 30 Apr 2006 12:38:32 +0200, James Kanze :


est il possible de passer "this" dans un constructeur?
Parfois. Une conversion implicite de this à un pointeur à un


type de base a un comportement indéfini :



Tiens ? Quelle en est la cause ?


§3.8/5. Surtout (concernant des pointeurs à l'objet) : « If the
object will be or was of a non-POD class type, the program has
undefined behavior if: [...] the pointer is implicitly converted
to a pointer to a base class type, »

La partie "Base" est pourtant totalement construite quand on
est dans le corps du constructeur de "Derived", non ?


Oui, mais si tu pars d'un Derived*, tu ne sais le convertir en
Base* que si la classe a été construite, ou au moins que le vptr
a été bien initialisée. Dans la pratique, ce n'est un problème
que dans le cas d'une base virtuelle -- donnée :

struct B {} ;
struct D : virtual B { D() ; } ;

Dans la liste des initialisateurs de D::D(), tu ne sais pas
forcément convertir le this en B*.

Enfin, je crois que c'est la motivation derrière la règle (et
c'est bien où ça ne marche pas avec Sun CC). Dans la pratique,
en revanche, il faut que le compilateur puisse le faire dans
certains contextes. Tu peux, par exemple, appeler une fonction
member de la base virtuelle, par exemple :

D::D() : someMember( memberOfB() ) {}

Ce qui marche avec Sun CC, même si « someMember( this ) » ne
marche pas si le constructeur de someMember prend un B*.

--
James Kanze
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34