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:

| Mais il me semble que nous n'arriverons pas à nous comprendre sur ce
| point. Du moins, je ne peux comprendre avec les seules informations
| que tu m'as données. Sans doute devrait-ce être suffisant pour le
| commun des mortels, mais pas pour moi.

Je viens juste de lire quelques messages de James parlant de « portée
de this ». Il faut remarquer que 'this' est un mot clé du langage
(identificateur omni-présent) et ne peut être sujet de déclaration.
Donc la notion de « portée de this » est sans objet puisqu'elle est
une contradiction dans les termes.

-- Gaby
Avatar
James Kanze
"Alain Naigeon" writes:

|> Par ailleurs, c'est bien vrai que pour quelqu'un qui se pose la
|> question d'utiliser this dans une liste du constructeur, c'est un
|> vrai miracle de tomber sur le paragraphe en question parmi tant
|> d'autres qui parlent des pointeurs... Mais enfin, maintenant qu'on
|> a le texte sous les yeux, c'est tout de même clair qu'il
|> concerne *aussi* this, il me semble.

Il concerne tout pointeur qui est visible. Il ne répond pas à la
question si this est visible ou non.

En fait, le paragraphe en question est intéressant par rapport à
this. Parce qu'il rend illégal l'initialisation des classes de base
dans la liste d'initialisation. Puisque l'intialisation d'une classe
de base implique la conversion de this en pointeur au type de base,
quelque chose qui est explicitement interdit ici (mais explicitement
permis ailleurs -- encore une contradiction dans la norme).

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Gabriel Dos Reis
James Kanze writes:

| "Alain Naigeon" writes:
|
| |> Par ailleurs, c'est bien vrai que pour quelqu'un qui se pose la
| |> question d'utiliser this dans une liste du constructeur, c'est un
| |> vrai miracle de tomber sur le paragraphe en question parmi tant
| |> d'autres qui parlent des pointeurs... Mais enfin, maintenant qu'on
| |> a le texte sous les yeux, c'est tout de même clair qu'il
| |> concerne *aussi* this, il me semble.
|
| Il concerne tout pointeur qui est visible.

Non. Pas du tout, ce paragraphe concerne toute expression de pointeur.

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

| En fait, le paragraphe en question est intéressant par rapport à
| this. Parce qu'il rend illégal l'initialisation des classes de base
| dans la liste d'initialisation. Puisque l'intialisation d'une classe
| de base implique la conversion de this en pointeur au type de base,
| quelque chose qui est explicitement interdit ici (mais explicitement
| permis ailleurs -- encore une contradiction dans la norme).

ce que tu écris ci-dessus est un pur non sens.

-- Gaby
Avatar
drkm
James Kanze writes:

On ne dit pas que le passage en question DOIT parler de la portée de
this.


Yep.

On dit simplement qu'il ne répond pas à la question posée. (Il
répond bien à d'autres questions, évidemment.)


Pour ma part, je ne peux me permettre d'affirmer cela face à
quelqu'un de beaucoup plus expérimenté. Mais ce quelqu'un devrait
alors me convaincre.

Je reste pour l'instant dans le doute, mais je ne vois vraiment pas
comment ce passage (3.8/5) réponderait à la question. Bien qu'il
donne de très importantes informations dans ce contexte.

--drkm

Avatar
Gabriel Dos Reis
James Kanze writes:

| drkm writes:
|
| |> James Kanze writes:
|
| |> > On ne dit pas que le passage en question DOIT parler de la
| |> > portée de this.
|
| |> Yep.
|
| |> > On dit simplement qu'il ne répond pas à la question
| |> > posée. (Il répond bien à d'autres questions,
| |> > évidemment.)
|
| |> Pour ma part, je ne peux me permettre d'affirmer cela face à
| |> quelqu'un de beaucoup plus expérimenté. Mais ce quelqu'un
| |> devrait alors me convaincre.
|
| Il y a aussi une question de langage qui joue. En gros, le passage en
| question parle des *utilisations* d'un pointeur quelconque. Il ne
| parle pas de la validité du pointeur.

Ahem.

-- Gaby
Avatar
Gabriel Dos Reis
drkm writes:

| Gabriel Dos Reis writes:
|
| > drkm writes:
|
| > | Mais il me semble que nous n'arriverons pas à nous comprendre sur ce
| > | point. Du moins, je ne peux comprendre avec les seules informations
| > | que tu m'as données. Sans doute devrait-ce être suffisant pour le
| > | commun des mortels, mais pas pour moi.
|
| > Je viens juste de lire quelques messages de James parlant de « portée
| > de this ». Il faut remarquer que 'this' est un mot clé du langage
| > (identificateur omni-présent) et ne peut être sujet de déclaration.
| > Donc la notion de « portée de this » est sans objet puisqu'elle est
| > une contradiction dans les termes.
|
| La question originale portait néanmoins sur la validité
| d'utilisation de `this´ dans la liste d'initialisation.

cette question je crois est réglée. Non ?


| Ce paragraphe
| donne d'importantes informations sur ce que l'on peut faire avec un
| tel pointeur,

ce paragraphe dit qu'on *peut utiliser* n'importe quel pointeur qui
désigne la mémoire de l'objet. 'this' est-il un tel pointeur, oui ou
non ?

| mais ce n'est pas lui qui confirme que l'on peut
| effectivement utiliser `this´ dans la liste d'initialisation.
|
| Et tu as affirmé que 3.8/5 le dit pourtant. Ce que je n'arrive pas
| à voir depuis le début.

et pour couronner le tout, on me parle maintenant de « visiblité de
this », quelque chose qui n'a pas de sens.

-- Gaby
Avatar
drkm
Gabriel Dos Reis writes:

drkm writes:

| Mais il me semble que nous n'arriverons pas à nous comprendre sur ce
| point. Du moins, je ne peux comprendre avec les seules informations
| que tu m'as données. Sans doute devrait-ce être suffisant pour le
| commun des mortels, mais pas pour moi.

Je viens juste de lire quelques messages de James parlant de « portée
de this ». Il faut remarquer que 'this' est un mot clé du langage
(identificateur omni-présent) et ne peut être sujet de déclaration.
Donc la notion de « portée de this » est sans objet puisqu'elle est
une contradiction dans les termes.


La question originale portait néanmoins sur la validité
d'utilisation de `this´ dans la liste d'initialisation. Ce paragraphe
donne d'importantes informations sur ce que l'on peut faire avec un
tel pointeur, mais ce n'est pas lui qui confirme que l'on peut
effectivement utiliser `this´ dans la liste d'initialisation.

Et tu as affirmé que 3.8/5 le dit pourtant. Ce que je n'arrive pas
à voir depuis le début.

--drkm

Avatar
Gabriel Dos Reis
drkm writes:

| > | Ce paragraphe donne d'importantes informations sur ce que l'on
| > | peut faire avec un tel pointeur,
|
| > ce paragraphe dit qu'on *peut utiliser* n'importe quel pointeur qui
| > désigne la mémoire de l'objet. 'this' est-il un tel pointeur, oui ou
| > non ?
|
| Si tu résumes la discution à cela, tu es contraint d'admettre que
|
| UneClass UneClass::UnMembreSTATIQUE()
| {
| return this ;
| }
|
| est valide.

Pourquoi ?

| > | mais ce n'est pas lui qui confirme que l'on peut effectivement
| > | utiliser `this´ dans la liste d'initialisation.
|
| > | Et tu as affirmé que 3.8/5 le dit pourtant. Ce que je n'arrive
| > | pas à voir depuis le début.
|
| > et pour couronner le tout, on me parle maintenant de « visiblité de
| > this », quelque chose qui n'a pas de sens.
|
| Je n'ai jamais parlé de visibilité de `this´.

Tu as acquiescé par un « yep » lorsque James a sorti le pigeon de son
chapeau.
Avatar
James Kanze
drkm writes:

|> > et pour couronner le tout, on me parle maintenant de
|> > « visiblité de this », quelque chose qui n'a pas de
|> > sens.

|> Je n'ai jamais parlé de visibilité de `this´.

C'est mon erreur. Mais j'aurais cru que le contexte rendait clair que
j'en parlais de la validité de l'utilisation du mot clé -- je
crois que tout le monde conviendrait qu'on ne peut pas utiliser le mot
clé this n'importe où.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Gabriel Dos Reis writes:

|> | > et pour couronner le tout, on me parle maintenant de
|> | > « visiblité de this », quelque chose qui n'a pas de
|> | > sens.

|> | Je n'ai jamais parlé de visibilité de `this´.

|> Tu as acquiescé par un « yep » lorsque James a sorti le
|> pigeon de son chapeau.

C'est qu'il ne cherche pas la petite bête, et qu'il a compris ce
que j'ai voulu dire, et non ce que j'ai dit mot à mot.

Mais bien, je t'accorde que quand on parle de la norme comme ça, il
vaut mieux être précis dans son langage. Alors, j'accepte les
torts pour la « portée ».

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
4 5 6 7 8