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 

Usage de 'using' sur des types simples

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





PostPosted: Wed Aug 30, 2006 9:12 am    Post subject: Usage de 'using' sur des types simples Reply with quote



Bonjour à tous,

dans un logiciel que je développe, j'ai défini un type 'boolean' dans un
namespace à moi. Dans l'ensemble de mes .h j'écris toujours l'ensemble
des namespaces nécessaires pour qualifier un type, mais dans les .cpp,
j'utilise un 'using namespace AMoi'. Le problème est que windows définit
lui aussi le type 'boolean' dans ses headers. Je pourrais qualifier
explicitement mon tous les 'boolean' de mon .cpp moi même mais cela
surchargerait pas mal. Il me semble avoir vu quelque part une syntaxe du
type 'using AMoi::MonType' pour lever l'ambiguïté. Est ce que quelque
chose de ce genre existe ?

A+
Yann
--
Yann Renard - To send me an email, remove no-spam sectionS Smile
Back to top
Fabien LE LEZ
Guest





PostPosted: Wed Aug 30, 2006 9:12 am    Post subject: Re: Usage de 'using' sur des types simples Reply with quote



On Wed, 30 Aug 2006 10:44:57 +0200, Yann Renard :

Quote:
Il me semble avoir vu quelque part une syntaxe du
type 'using AMoi::MonType' pour lever l'ambiguïté.

En l'occurence, ça ne lèvera rien du tout. C'est juste l'équivalent de
"using namespace AMoi", sauf que ça ne concerne qu'un type au lieu de
l'ensemble des types définis dans le namespace.

Il y a un autre usage de using, qui n'a rien à voir (et qui aurait
aussi bien pu utiliser un autre mot-clé) : il permet de "recopier"
explicitement une déclaration d'une classe de base dans une classe
dérivée.

Pour ton problème, il n'y a pas beaucoup de solutions : il faut
changer de nom. Le nom "boolean" ne convient pas ; le nom
"AMoi::boolean" convient dans l'absolu mais ne te plait pas ; il faut
donc en trouver un autre, puis le déclarer par typedef :

typedef AMoi::boolean MonBool.


C'est d'ailleurs une bonne raison pour choisir des identifiants en
français (surtout si le nom du namespace est en français) : tu as peu
de risque de trouver un nom "booleen" dans les headers de Windows...
Back to top
Yann Renard
Guest





PostPosted: Wed Aug 30, 2006 3:00 pm    Post subject: Re: Usage de 'using' sur des types simples Reply with quote



Fabien LE LEZ wrote:
Quote:
On Wed, 30 Aug 2006 11:30:22 +0200, Michel Decima
michel.decima@orange-ft.com>:

pourquoi ne pas utiliser le type bool qui fait partie du langage ?

Il ne suffit pas toujours.
Par exemple, j'ai un type "Booleen", qui fonctionne à peu près comme
bool (et est convertible en un bool), mais dont l'argument template
sert d'initialiseur.

Ainsi, je peux écrire, comme membre d'une classe :

Booleen<true> machin;

et zou, j'ai la déclaration de la variable et son initialisation sur
la même ligne.

bool machin=true; // ;)

Bref, je sais que bool est a priori défini dans la norme, mais je crois
avoir eu des problèmes dans le passé avec ce type... cela fait longtemps
et je ne saurais plus dire sur quel type de plateforme.

Yann
--
Yann Renard - To send me an email, remove no-spam sectionS Smile
Back to top
Michel Decima
Guest





PostPosted: Wed Aug 30, 2006 3:13 pm    Post subject: Re: Usage de 'using' sur des types simples Reply with quote

Yann Renard a écrit :
Quote:
Fabien LE LEZ wrote:
On Wed, 30 Aug 2006 11:30:22 +0200, Michel Decima
michel.decima@orange-ft.com>:

pourquoi ne pas utiliser le type bool qui fait partie du langage ?

Il ne suffit pas toujours.
Par exemple, j'ai un type "Booleen", qui fonctionne à peu près comme
bool (et est convertible en un bool), mais dont l'argument template
sert d'initialiseur.

Ainsi, je peux écrire, comme membre d'une classe :

Booleen<true> machin;

et zou, j'ai la déclaration de la variable et son initialisation sur
la même ligne.

bool machin=true; // Wink

Je pense l'ecriture de Fabien concernait la declaration d'un membre
d'une classe, et dans ce cas on ne peut pas faire l'initialisation
immediatement avec machin=true (faut attendre d'etre dans un constructeur).

Quote:
Bref, je sais que bool est a priori défini dans la norme, mais je crois
avoir eu des problèmes dans le passé avec ce type... cela fait longtemps
et je ne saurais plus dire sur quel type de plateforme.

bool est defini dans la norme, sans aucun a-priori. Je veux bien
admettre que certains compilateurs antediluviens n'implémentaient pas
bool, mais ca ne me semble pas une raison suffisante pour ne pas
utiliser ce type. J'aurais plutot tendance a utiliser bool directement
si (puisque) mon compilateur le supporte, et je commencerais a penser
a une solution de remplacement seulement si le probleme vient a se
poser et qu'on ne peut pas mettre a jour le compilo.
Back to top
Fabien LE LEZ
Guest





PostPosted: Wed Aug 30, 2006 3:25 pm    Post subject: Re: Usage de 'using' sur des types simples Reply with quote

On Wed, 30 Aug 2006 12:01:38 +0200, Michel Decima
<michel.decima@orange-ft.com>:

Quote:
Booleen<true> machin;

et zou, j'ai la déclaration de la variable et son initialisation sur
la même ligne.

Je vois ce que tu veux dire, mais je ne suis pas sur d'aimer ce genre
de declarations.

J'avoue n'avoir rien trouvé de mieux.
Balancer l'initialisation dans le constructeur est encore moins
lisible.

Peut-être pourrait-on améliorer le nom de cette classe, toutefois.

Quote:
Question: est ce que 'machin' peut changer de valeur ?

Oui. Sinon j'aurais écrit
Booleen<true> machin const;

Quote:
En particulier, est ce que je pourrait ecrire ceci:

Booleen<true> machin = false;

Non. Le constructeur de Booleen n'accepte aucun argument[*].
Par contre tu pourrais écrire :
Booleen<true> machin;
machin= false;

Note qu'un Booleen<> n'a d'utilité que comme membre d'une classe.



[*] Grosso modo, ça donne :

template <bool valeur_initiale> class Booleen
{
private:
bool valeur;

public:
Booleen() : valeur (valeur_initiale) {}
/* Ici, toutes les fonctions qui permettent d'utiliser cette classe
comme un bool */
};
Back to top
Michel Decima
Guest





PostPosted: Wed Aug 30, 2006 4:19 pm    Post subject: Re: Usage de 'using' sur des types simples Reply with quote

Fabien LE LEZ a écrit :
Quote:
On Wed, 30 Aug 2006 12:01:38 +0200, Michel Decima
michel.decima@orange-ft.com>:

Booleen<true> machin;

et zou, j'ai la déclaration de la variable et son initialisation sur
la même ligne.
Je vois ce que tu veux dire, mais je ne suis pas sur d'aimer ce genre
de declarations.

J'avoue n'avoir rien trouvé de mieux.

Je le comprends.

Quote:
Balancer l'initialisation dans le constructeur est encore moins
lisible.

Mais c'est coherent avec le reste des membres qui y seront initialises
(parce que la technique en question marche pour des entiers, mais avec
un double ou une chaine de caracteres ou...)

Quote:
Peut-être pourrait-on améliorer le nom de cette classe, toutefois.

Effectivement, mais en gardant a l'esprit la necessite de lisibilite
ca va etre difficile ;)

Quote:

Question: est ce que 'machin' peut changer de valeur ?

Oui. Sinon j'aurais écrit
Booleen<true> machin const;

Certes. Je voulais dire: est ce que 'Boolean<true>' peut prendre
la valeur 'false'.

Quote:
En particulier, est ce que je pourrait ecrire ceci:

Booleen<true> machin = false;

Non. Le constructeur de Booleen n'accepte aucun argument[*].

C'est deja pas mal, parce que si l'ecriture ci-dessus etait possible
(et utilisee), j'aurais du mal a comprendre du premier coup d'oeil ce
qui se passe reellement.

Quote:
Par contre tu pourrais écrire :
Booleen<true> machin;
machin= false;

Note qu'un Booleen<> n'a d'utilité que comme membre d'une classe.

Effectivement.
Back to top
Fabien LE LEZ
Guest





PostPosted: Wed Aug 30, 2006 4:47 pm    Post subject: Re: Usage de 'using' sur des types simples Reply with quote

On Wed, 30 Aug 2006 13:19:00 +0200, Michel Decima
<michel.decima@orange-ft.com>:

Quote:
Balancer l'initialisation dans le constructeur est encore moins
lisible.

Mais c'est coherent avec le reste des membres qui y seront initialises
(parce que la technique en question marche pour des entiers, mais avec
un double ou une chaine de caracteres ou...)

En pratique, j'ai souvent besoin de booléens pré-initialisés dans des
classes assez grosses.

Quote:
Question: est ce que 'machin' peut changer de valeur ?

Oui. Sinon j'aurais écrit
Booleen<true> machin const;

Certes. Je voulais dire: est ce que 'Boolean<true>' peut prendre
la valeur 'false'.

Oui. Sinon, ce serait un
static bool machin const= true;

C'est pour ça que le nom est peut-être mal choisi.

Mais en pratique, la variable "machin" est utilisée comme un "bool",
et le type Booleen<> est oublié.

Quote:
En particulier, est ce que je pourrait ecrire ceci:

Booleen<true> machin = false;

Non. Le constructeur de Booleen n'accepte aucun argument[*].

C'est deja pas mal, parce que si l'ecriture ci-dessus etait possible
(et utilisee),

Ça n'aurait aucun intérêt. Si on peut initialiser la variable tout de
suite, bool convient mieux.

En fait, peut-être devrais-je faire une classe plus générale,
utilisable un peu de la même façon :

Initialiseur <bool, true> machin;
Back to top
kanze
Guest





PostPosted: Wed Aug 30, 2006 7:31 pm    Post subject: Re: Usage de 'using' sur des types simples Reply with quote

Fabien LE LEZ wrote:
Quote:
On Wed, 30 Aug 2006 10:44:57 +0200, Yann Renard :

Il me semble avoir vu quelque part une syntaxe du
type 'using AMoi::MonType' pour lever l'ambiguïté.

En l'occurence, ça ne lèvera rien du tout. C'est juste
l'équivalent de "using namespace AMoi", sauf que ça ne
concerne qu'un type au lieu de l'ensemble des types définis
dans le namespace.

Pas du tout. Un « using namespace AMoi ; » (dit « using
directive » dans la norme) joue sur la
recherche des noms. Un « using AMoi::boolean » est une
déclaration, comme un typedef. S'il existe déjà un symbole
« boolean » dans l'espace référentiel, il y a une erreur
immédiate.

Quote:
Il y a un autre usage de using, qui n'a rien à voir (et qui
aurait aussi bien pu utiliser un autre mot-clé) : il permet de
"recopier" explicitement une déclaration d'une classe de base
dans une classe dérivée.

C'est en fait exactement le même « using » que la declarations
à la portée référencielle. C'est une « declaration » dans la
portée où elle apparaît.

--
James Kanze GABI Software
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
Yann Renard
Guest





PostPosted: Wed Aug 30, 2006 8:17 pm    Post subject: Re: Usage de 'using' sur des types simples Reply with quote

kanze wrote:
Quote:
Fabien LE LEZ wrote:
On Wed, 30 Aug 2006 10:44:57 +0200, Yann Renard :

Il me semble avoir vu quelque part une syntaxe du
type 'using AMoi::MonType' pour lever l'ambiguïté.

En l'occurence, ça ne lèvera rien du tout. C'est juste
l'équivalent de "using namespace AMoi", sauf que ça ne
concerne qu'un type au lieu de l'ensemble des types définis
dans le namespace.

Pas du tout. Un « using namespace AMoi ; » (dit « using
directive » dans la norme) joue sur la
recherche des noms. Un « using AMoi::boolean » est une
déclaration, comme un typedef. S'il existe déjà un symbole
« boolean » dans l'espace référentiel, il y a une erreur
immédiate.

Il y a un autre usage de using, qui n'a rien à voir (et qui
aurait aussi bien pu utiliser un autre mot-clé) : il permet de
"recopier" explicitement une déclaration d'une classe de base
dans une classe dérivée.

C'est en fait exactement le même « using » que la declarations
à la portée référencielle. C'est une « declaration » dans la
portée où elle apparaît.

Merci :)

Yann
--
Yann Renard - To send me an email, remove no-spam sectionS Smile
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.