OVH Cloud OVH Cloud

'this' : used in base member initializer list

80 réponses
Avatar
amerio
Bonjour,
Mon pb doit est le suivant : une classe doit initialisé un de ses membres
avec un pointeur dur elle même :

class B
{
public:
B(class A* pA) : m_pA(pA) {}
private:
class A* m_pA;
}

class A
{
public:
A() : m_B(this) {} // warning 'this' : used in base member
initializer list
private:
const B m_B;
}

Comment eviter le warning (sous VC6) (et d'abord, dois je l'éviter ou
changer de technique ? quel est le risque ?)
Au passage, boost:: utilise cette technique, cf
http://www.boost.org/libs/smart_ptr/sp_techniques.html#weak_without_shared

10 réponses

4 5 6 7 8
Avatar
Gabriel Dos Reis
drkm writes:

| Gabriel Dos Reis writes:
|
| > James Kanze writes:
|
| > | Gabriel Dos Reis writes:
|
| > | |> James Kanze writes:
|
| > | |> | Il ne répond pas à la question si this est visible ou non.
|
| > | |> simplement parce que « thjis est visible » est quelque chose
| > | |> que tu viens d'inventer ? Voir le chapitre 3 sur la notion de
| > | |> portée.
|
| > | D'accord. Je sais que c'est un mot clé, et je sais qu'il n'a donc
| > | pas de « portée ».
|
| > Ah bon. « je sais que c'est un non sens mais je l'écris quand même ».
|
| Mmm. Je sais que c'est de la démagogie mais je l'écris quand
| même...

non sens n'est pas forcdément démagogie.

-- Gaby
Avatar
drkm
Gabriel Dos Reis writes:

drkm writes:

| Gabriel Dos Reis writes:

| > James Kanze writes:

| > | Gabriel Dos Reis writes:

| > | |> James Kanze writes:

| > | |> | Il ne répond pas à la question si this est visible ou
| > | |> | non.

| > | |> simplement parce que « thjis est visible » est quelque
| > | |> chose que tu viens d'inventer ? Voir le chapitre 3 sur la
| > | |> notion de portée.

| > | D'accord. Je sais que c'est un mot clé, et je sais qu'il n'a
| > | donc pas de « portée ».

| > Ah bon. « je sais que c'est un non sens mais je l'écris qua nd
| > même ».

| Mmm. Je sais que c'est de la démagogie mais je l'écris qua nd
| même...

non sens n'est pas forcdément démagogie.


Certes. Je ne parlais pas de James.

--drkm

Avatar
Gabriel Dos Reis
drkm writes:

| Certes. Je ne parlais pas de James.

Ah, tu parlais de toi donc.

-- Gaby
Avatar
Alain Naigeon
a écrit dans le message news:

"Alain Naigeon" wrote in message

5 Before the lifetime of an object has started but after the storage
which the object will occupy has been allocated34) [or, ...] any
pointer that refers to the storage location where the object will be
[or was] located may be used but only in limited ways. Such a pointer
refers to allocated storage (3.7.3.2), and using the pointer as if the
pointer were of type void*, is welldefined. Such a pointer may be
dereferenced but the resulting lvalue may only be used in limited
ways, as described below.


Ceci ne repond pas à la question : « est-ce que une expression this est
valide à ce moment ? » Tout ce qu'il dit, c'est que si une expression
this est valide, on ne peut s'en servir que d'une façon limitée.


Bon, ma lecture, à tout hasard : "may be used but only in limited ways" .
Peut être utilisé mais d'une façon restreinte (celle-ci précisée peu après
avec des exemples et contre-exemples, mais je n'ai pas eu le courage
de tout citer). Il n'y a pas le mot "valide" (c'est à dire qu' AMHA il faut
comprendre : usage valide si les conditions restreintes sont remplies)

Certes. Mais pour que ce s'applique à une expression this, il faut
qu'une expression this soit valide à cet endroit. Il n'y a rien dans ce
passage qui laisse croire que « this » est une expression valide qui
donne l'adresse de l'objet à construire, et c'était bien ça la question.


Ah... c'est donc cela que tu appelais valide, ok. Bon, effectivement,
mais si tu peux faire plein de choses dans un constructeur, il faut bien
que l'allocation soit faite. Donc, oui, la seule chose qui n'est pas dite
*ici*, c'est que this est un pointeur sur une zone allouée correctement
quand on arrive dans la liste puis dans le corps du constructeur.
Mais ça c'est la définition de this, donnée ailleurs (je suis trop
paresseux,
ce soir, pour chercher). Une fois que this est, ailleurs, défini comme un
pointeur sur une zone bien allouée, alors, chaque fois qu'on parle d'une
telle catégorie de pointeurs, il n'y a plus de raison de signaler en
permanence
this comme un cas particulier.
Voilà ma compréhension actuelle des choses à la lumière de ce fil, comme
quoi ça sert peut-être de discuter et de lire...

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France


Avatar
Arnaud Meurgues
Gabriel Dos Reis wrote:

| Certes. Je ne parlais pas de James.
Ah, tu parlais de toi donc.


Voici le deuxième « c'est c'ui qui dit qui y est » de la semaine. Tu es
à la pointe des techniques d'argumentation.

Chapeau bas...

Arnaud

Avatar
kanze
"Alain Naigeon" wrote in message
news:<3f148d43$0$16253$...
a écrit dans le message news:

"Alain Naigeon" wrote in message



[...]
Certes. Mais pour que ce s'applique à une expression this, il faut
qu'une expression this soit valide à cet endroit. Il n'y a rien dans
ce passage qui laisse croire que « this » est une expression valide
qui donne l'adresse de l'objet à construire, et c'était bien ça la
question.


Ah... c'est donc cela que tu appelais valide, ok.


Je cherche le bon mot. Ce n'est pas évident, avec mon vocabulaire
limité. Je trouve que le mot « portée » donnait l'idée le mieux, même si
techniquement, ce n'est pas correct. Mais bon, ça n'a pas plus à
d'autres.

Bon, effectivement, mais si tu peux faire plein de choses dans un
constructeur, il faut bien que l'allocation soit faite. Donc, oui, la
seule chose qui n'est pas dite *ici*, c'est que this est un pointeur
sur une zone allouée correctement quand on arrive dans la liste puis
dans le corps du constructeur.


La seule chose qui n'est pas dit ici, c'est que tu as droit d'utiliser
le mot clé « this » dans le contexte en question. Étant donné que le
passage parle d'un état lors de l'execution (la mémoire a été allouée,
mais le constructeur n'a pas fini), et non d'un contexte -- ce qu'il dit
vaut aussi pour des pointeurs dans des fonctions statiques, par exemple,
où l'utilisation de « this » n'est pas permis --, c'est normal. Mais du
coup, il ne répond pas à la question initiale.

Mais ça c'est la définition de this, donnée ailleurs (je suis trop
paresseux, ce soir, pour chercher).


Toute la question initiale tournée justement sur les contextes où le mot
clé « this » était permis. Pas ce qu'on pourrait faire avec le pointeur,
mais si on « avait » le pointeur.

Une fois que this est, ailleurs, défini comme un pointeur sur une zone
bien allouée, alors, chaque fois qu'on parle d'une telle catégorie de
pointeurs, il n'y a plus de raison de signaler en permanence this
comme un cas particulier.


Certes. Personne le démandait. Le paragraphe en question a quelques
problèmes (par exemple, le fait qu'il contradit d'autres paragraphes
dans la norme), mais il n'y a aucune raison qu'il parle explicitement de
this.

Seulement, s'il ne définit pas où on peut légalement se servir de this,
il ne faut pas insister qu'il le fasse.

--
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


Avatar
Gabriel Dos Reis
Arnaud Meurgues writes:

| Gabriel Dos Reis wrote:
|
| > | Certes. Je ne parlais pas de James.
| > Ah, tu parlais de toi donc.
|
| Voici le deuxième « c'est c'ui qui dit qui y est » de la semaine. Tu
| es à la pointe des techniques d'argumentation.

Juste dderrière toi.

-- Gaby
Avatar
Arnaud Meurgues
Gabriel Dos Reis wrote:

| Voici le deuxième « c'est c'ui qui dit qui y est » de la semaine. Tu
| es à la pointe des techniques d'argumentation.
Juste dderrière toi.


Et de trois.

Arnaud (qui se croirait dans la cours d'école de son fils)

Avatar
drkm
"Alain Naigeon" writes:

Donc, oui, la seule chose qui n'est pas dite *ici*, c'est que this
est un pointeur sur une zone allouée correctement quand on arrive
dans la liste puis dans le corps du constructeur. Mais ça c'est la
définition de this, donnée ailleurs


Bien sûr. Tout le sujet de ce sous-fil était que le fait que
« `this´ peut être utilisé dans la liste d'initialisation » n'est pas
exprimé dans 3.8/5, mais autre part.

3.8/5 donne les conditions de son utilisation lorsqu'il remplit
certaines conditions particulières.

Une fois que this est, ailleurs, défini comme un pointeur sur une
zone bien allouée, alors, chaque fois qu'on parle d'une telle
catégorie de pointeurs, il n'y a plus de raison de signaler en
permanence this comme un cas particulier.


Yep.

--drkm

Avatar
drkm
Arnaud Meurgues writes:

Gabriel Dos Reis wrote:

| Voici le deuxième « c'est c'ui qui dit qui y est » de la
| semaine. Tu es à la pointe des techniques d'argumentation.

Juste dderrière toi.


Et de trois.

Arnaud (qui se croirait dans la cours d'école de son fils)


Tu es jeune papa, alors. :-)

--drkm


4 5 6 7 8