 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Bruno Causse Guest
|
Posted: Sat Apr 29, 2006 10:07 am Post subject: passer son pointeur pendant sa creation? |
|
|
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 |
|
| Back to top |
|
 |
Bruno Causse Guest
|
Posted: Sat Apr 29, 2006 11:06 am Post subject: Re: passer son pointeur pendant sa creation? |
|
|
Bruno Causse <pasde.hcyrano.spam (AT) free (DOT) fr> wrote:
| Quote: | 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 |
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Sat Apr 29, 2006 12:06 pm Post subject: Re: passer son pointeur pendant sa creation? |
|
|
On Sat, 29 Apr 2006 13:00:41 +0200, pasde.hcyrano.spam (AT) free (DOT) fr (Bruno
Causse):
| Quote: | est il possible de passer "this" dans un constructeur?
|
Oui. |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Apr 30, 2006 11:06 am Post subject: Re: passer son pointeur pendant sa creation? |
|
|
Fabien LE LEZ wrote:
| Quote: | On Sat, 29 Apr 2006 13:00:41 +0200, pasde.hcyrano.spam (AT) free (DOT) 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 (AT) neuf (DOT) 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 |
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Sun Apr 30, 2006 12:06 pm Post subject: Re: passer son pointeur pendant sa creation? |
|
|
On Sun, 30 Apr 2006 12:38:32 +0200, James Kanze <kanze.james (AT) neuf (DOT) fr>:
| Quote: | 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 ? |
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Sun Apr 30, 2006 9:06 pm Post subject: Re: passer son pointeur pendant sa creation? |
|
|
Fabien LE LEZ wrote:
| Quote: | On Sun, 30 Apr 2006 12:38:32 +0200, James Kanze <kanze.james (AT) neuf (DOT) 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, »
| Quote: | 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: (), 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: () : 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 (AT) neuf (DOT) 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 |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|