C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

pb mutable

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
beny78
Guest





PostPosted: Thu Oct 19, 2006 8:05 pm    Post subject: pb mutable Reply with quote



Bonjour,

je fais des évolutions dans une code qui n'est pas le mien et je
rencontre quelque problèmes.
j'ai une classe A et j'aimerai passer en arguments de fonction un
"const &"/"const *" (peu importe) sur une instance de cette classe.

ex :

class A
{
private:
std::map<....>* map //attribut

std::map<...>* get() //si map n'existe pas alors appel de load

load() // faite un new std::map<...>
};

Donc dans ma fonction qui a en arguements const A& / const A* et
comme get() n'est pas const je me fais jetter par le compilo.

donc il faut le passer en const, du coup j'ai mis map en mutable, mais
ce ne change rien.
il aurais fallut de get() fasse un new map pour que se soit bon Sad or
il appelle load qui n'est pas une fonction const )

il y a-t-il une solution élégante.

Sinon je cast mon "const A*" en "A*" lorsque j'appelle get().

merci.
Back to top
Fabien LE LEZ
Guest





PostPosted: Thu Oct 19, 2006 11:18 pm    Post subject: Re: pb mutable Reply with quote



On 19 Oct 2006 08:05:37 -0700, "beny78" <beny78 (AT) gmail (DOT) com>:

Quote:
std::map<....>* map //attribut

Utiliser un nom existant pour une variable est une très mauvaise idée.
C'est même à la limite de l'obfuscation.

Quote:
il aurais fallut de get() fasse un new map pour que se soit bon Sad or
il appelle load qui n'est pas une fonction const )

Est-ce que "load()" modifie une variable membre non mutable, ou
appelle une fonction non-const ?
Si la réponse est "non", cette fonction peut être déclarée "const".
Back to top
Manuel Zaccaria
Guest





PostPosted: Fri Oct 20, 2006 3:04 am    Post subject: Re: pb mutable Reply with quote



beny78 a écrit:
Quote:
Bonjour,

je fais des évolutions dans une code qui n'est pas le mien et je
rencontre quelque problèmes.
j'ai une classe A et j'aimerai passer en arguments de fonction un
"const &"/"const *" (peu importe) sur une instance de cette classe.

ex :

class A
{
private:
std::map<....>* map //attribut

std::map<...>* get() //si map n'existe pas alors appel de load

load() // faite un new std::map<...
};

Donc dans ma fonction qui a en arguements const A& / const A* et
comme get() n'est pas const je me fais jetter par le compilo.

donc il faut le passer en const, du coup j'ai mis map en mutable, mais
ce ne change rien.
il aurais fallut de get() fasse un new map pour que se soit bon Sad or
il appelle load qui n'est pas une fonction const )

il y a-t-il une solution élégante.

Sinon je cast mon "const A*" en "A*" lorsque j'appelle get().

merci.

Je sais pas si c'est vraiment une bonne idée mais des fois on
a pas le choix...

si get est déclaré const et qu'on doit appeler load qui ne
l'est pas, on peut faire un truc comme ça :

class A
{
// ...

void load()
{
map_ = ...;
}

std::map<...>* get() const
{
if(!map_)
{
const_cast<A*>(this)->load();
}
return map_;
}
};


-
Manuel Zaccaria
Back to top
kanze
Guest





PostPosted: Fri Oct 20, 2006 9:12 am    Post subject: Re: pb mutable Reply with quote

beny78 wrote:

Quote:
je fais des évolutions dans une code qui n'est pas le mien et je
rencontre quelque problèmes.
j'ai une classe A et j'aimerai passer en arguments de fonction un
"const &"/"const *" (peu importe) sur une instance de cette classe.

ex :

class A
{
private:
std::map<....>* map //attribut

std::map<...>* get() //si map n'existe pas alors appel de load

load() // faite un new std::map<...
};

Donc dans ma fonction qui a en arguements const A& / const A*
et comme get() n'est pas const je me fais jetter par le
compilo.

donc il faut le passer en const, du coup j'ai mis map en mutable, mais
ce ne change rien.

Certes. Parce que ce n'est pas get() qui modifie map, mais load.

Quote:
il aurais fallut de get() fasse un new map pour que se soit bon Sad or
il appelle load qui n'est pas une fonction const )

il y a-t-il une solution élégante.

Je suppose que ce que tu implémentes en fait, c'est le
chargement paresseux, et que conceptuellement, le map est const,
et ne varie jamais. (C-à-d que vu de l'extérieur, on voit
toujours le même contenu. Dans ce cas-là, je ne vois pas
pourquoi « load » ne serait pas const ; de même que get(), il
ne modifie pas la valeur de la classe vue de l'extérieur. Même
si le map n'est pas const, si le load n'est qu'un chargement
paresseux de la valeur initiale (persistente), je dirais qu'elle
est conceptuellement const, et qu'on pourrait donc la déclarer
const.

Mais j'ai des petites doutes par ailleurs :

-- get() renvoie un pointeur non const au map. C-à-d que le
client pourrait modifier le map, même si il n'en detient
qu'un pointeur vers const. La solution classique, ici, c'est
d'avoir deux fonctions, une const, qui renvoie un pointeur à
const, et l'autre non-const, qui renvoie un pointeur à non
const. Mais...

-- Est-ce que le fait d'exposer le map comme ça ne brise pas
l'encapsulation trop ? Quel est l'intérêt de mettre le map
dans la classe, si n'importe qui peut le modifier n'importe
comment ?

Quote:
Sinon je cast mon "const A*" en "A*" lorsque j'appelle get().

Au niveau du client, j'espère que non. À l'intérieur de get(),
en revanche, c'est une solution potentielle. C'est une solution
qui sert beaucoup, même, quand la fonction n'est pas triviale et
qu'il y a une version const et non-const, pour qu'une des
versions revoie simplement à l'autre.

--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
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
beny78
Guest





PostPosted: Fri Oct 20, 2006 4:51 pm    Post subject: Re: pb mutable Reply with quote

Tout d'abord, merci de vos réponses.
Et je tiens à ajouter que le code de la classe A n'est pas le mien.

Le get() fait en effet un chargement paresseux, donc conceptuellement
la
fonction get() est const. (Cette fonction devrait renvoyer une const
map<...>*, je vais d'ailleurs faire la modif).

Quote:
Au niveau du client, j'espère que non.

bah en fait je pensais à cette solution Sad
mais je vais le faire dans le get, c'est beaucoup plus propre et
transfomer le get en get() const.

Merci pour la solution.

kanze a écrit :

Quote:
beny78 wrote:

je fais des évolutions dans une code qui n'est pas le mien et je
rencontre quelque problèmes.
j'ai une classe A et j'aimerai passer en arguments de fonction un
"const &"/"const *" (peu importe) sur une instance de cette classe.

ex :

class A
{
private:
std::map<....>* map //attribut

std::map<...>* get() //si map n'existe pas alors appel de load

load() // faite un new std::map<...
};

Donc dans ma fonction qui a en arguements const A& / const A*
et comme get() n'est pas const je me fais jetter par le
compilo.

donc il faut le passer en const, du coup j'ai mis map en mutable, mais
ce ne change rien.

Certes. Parce que ce n'est pas get() qui modifie map, mais load.

il aurais fallut de get() fasse un new map pour que se soit bon Sad or
il appelle load qui n'est pas une fonction const )

il y a-t-il une solution élégante.

Je suppose que ce que tu implémentes en fait, c'est le
chargement paresseux, et que conceptuellement, le map est const,
et ne varie jamais. (C-à-d que vu de l'extérieur, on voit
toujours le même contenu. Dans ce cas-là, je ne vois pas
pourquoi « load » ne serait pas const ; de même que get(), il
ne modifie pas la valeur de la classe vue de l'extérieur. Même
si le map n'est pas const, si le load n'est qu'un chargement
paresseux de la valeur initiale (persistente), je dirais qu'elle
est conceptuellement const, et qu'on pourrait donc la déclarer
const.

Mais j'ai des petites doutes par ailleurs :

-- get() renvoie un pointeur non const au map. C-à-d que le
client pourrait modifier le map, même si il n'en detient
qu'un pointeur vers const. La solution classique, ici, c'est
d'avoir deux fonctions, une const, qui renvoie un pointeur à
const, et l'autre non-const, qui renvoie un pointeur à non
const. Mais...

-- Est-ce que le fait d'exposer le map comme ça ne brise pas
l'encapsulation trop ? Quel est l'intérêt de mettre le map
dans la classe, si n'importe qui peut le modifier n'importe
comment ?

Sinon je cast mon "const A*" en "A*" lorsque j'appelle get().

Au niveau du client, j'espère que non. À l'intérieur de get(),
en revanche, c'est une solution potentielle. C'est une solution
qui sert beaucoup, même, quand la fonction n'est pas triviale et
qu'il y a une version const et non-const, pour qu'une des
versions revoie simplement à l'autre.

--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.