On Sat, 29 Apr 2006 13:00:41 +0200, (Bruno Causse):
est il possible de passer "this" dans un constructeur?
Oui.
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
Fabien LE LEZ wrote:
On Sat, 29 Apr 2006 13:00:41 +0200, pasde.hcyrano.spam@free.fr
(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 kanze.james@neuf.fr
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
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
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 ?
On Sun, 30 Apr 2006 12:38:32 +0200, James Kanze <kanze.james@neuf.fr>:
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 ?
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 ?
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
Fabien LE LEZ wrote:
On Sun, 30 Apr 2006 12:38:32 +0200, James Kanze <kanze.james@neuf.fr>:
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 kanze.james@neuf.fr
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
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