#define : Alias de fonctions ou de champ d'une structure ?
25 réponses
Stephane Wirtel
bonjour à tous,
Je ne sais pas pourquoi, mais je pense avoir vu un jour un bout de code écrit en C ou C++, qui
donnait la possibilité de créer un alias d'un champ dans une structure.
Je pense que cela se basait sur #define, style:
typedef struct StructFun {
int age;
#define Age age
} StructFun;
Aurais-je rêvé ? Avez-vous déjà vu ayant une similitude avec ma description ?
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel :
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
int age;
#define Age age
Et ça, j'espère que même les programmeurs C ne le font plus. Tu es en train de dire que partout dans ton programme, l'identifiant "Age" est un synonyme de "age".
Si dans une autre classe, tu as deux membres "age" et "Age" : - soit cette autre classe est définie avant, et dans ce cas tu ne peux plus accéder à son membre "Age" ; - soit cette autre classe est définie après, et dans ce cas ça ne compile pas.
Pour répondre à ta question dans le cadre du C++ (pour le C, c'est fr.comp.lang.c) :
- pour une variable, c'est plus compliqué (Peut-être peut-on faire quelque chose avec un "union" ?), mais a priori le cas est très rare de toute façons, puisque généralement, une variable membre est privée.
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
<com.descasoft@wirtel.stephane>:
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
int age;
#define Age age
Et ça, j'espère que même les programmeurs C ne le font plus.
Tu es en train de dire que partout dans ton programme, l'identifiant
"Age" est un synonyme de "age".
Si dans une autre classe, tu as deux membres "age" et "Age" :
- soit cette autre classe est définie avant, et dans ce cas tu
ne peux plus accéder à son membre "Age" ;
- soit cette autre classe est définie après, et dans ce cas ça
ne compile pas.
Pour répondre à ta question dans le cadre du C++ (pour le C, c'est
fr.comp.lang.c) :
- pour une variable, c'est plus compliqué (Peut-être peut-on faire
quelque chose avec un "union" ?), mais a priori le cas est très rare
de toute façons, puisque généralement, une variable membre est privée.
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel :
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
int age;
#define Age age
Et ça, j'espère que même les programmeurs C ne le font plus. Tu es en train de dire que partout dans ton programme, l'identifiant "Age" est un synonyme de "age".
Si dans une autre classe, tu as deux membres "age" et "Age" : - soit cette autre classe est définie avant, et dans ce cas tu ne peux plus accéder à son membre "Age" ; - soit cette autre classe est définie après, et dans ce cas ça ne compile pas.
Pour répondre à ta question dans le cadre du C++ (pour le C, c'est fr.comp.lang.c) :
- pour une variable, c'est plus compliqué (Peut-être peut-on faire quelque chose avec un "union" ?), mais a priori le cas est très rare de toute façons, puisque généralement, une variable membre est privée.
Stephane Wirtel
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel :
typedef struct StructFun {
Ça, c'est sans aucun doute du C. A quoi vois-tu que cela est du C ?
int age; #define Age age
Et ça, j'espère que même les programmeurs C ne le font plus. Tu es en train de dire que partout dans ton programme, l'identifiant "Age" est un synonyme de "age". Dans l'exemple donné, il était demandé si il était possible d'implémenter
des alias sur des champs.
Si dans une autre classe, tu as deux membres "age" et "Age" : - soit cette autre classe est définie avant, et dans ce cas tu ne peux plus accéder à son membre "Age" ; - soit cette autre classe est définie après, et dans ce cas ça ne compile pas.
Pour répondre à ta question dans le cadre du C++ (pour le C, c'est fr.comp.lang.c) : Je ne vais pas sur fr.comp.lang.c car il s'agit d'un code source écrit en C++,
et tu sais aussi bien que moi que le compilateur travaille différemment en fct du langage qu'on lui donne.
- pour une fonction, c'est fort simple : Dans le mail, je précisais un champ d'une structure et non une méthode,
la surcharge aurait été très facile à faire et je ne pense pas que j'aurais posé la question.
struct A { public: void age(); void Age() { age(); } }; Une structure est directement public que cela soit les méthodes ou les champs.
- pour une variable, c'est plus compliqué (Peut-être peut-on faire quelque chose avec un "union" ?), mais a priori le cas est très rare de toute façons, puisque généralement, une variable membre est privée. L'union doit être nommée, et cela veut dire que si je veux accéder à mon champ,
je dois préfixer chaque accès par le nom de la variable du type de l'union.
Bonne soirée,
Stéphane
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
<com.descasoft@wirtel.stephane>:
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
A quoi vois-tu que cela est du C ?
int age;
#define Age age
Et ça, j'espère que même les programmeurs C ne le font plus.
Tu es en train de dire que partout dans ton programme, l'identifiant
"Age" est un synonyme de "age".
Dans l'exemple donné, il était demandé si il était possible d'implémenter
des alias sur des champs.
Si dans une autre classe, tu as deux membres "age" et "Age" :
- soit cette autre classe est définie avant, et dans ce cas tu
ne peux plus accéder à son membre "Age" ;
- soit cette autre classe est définie après, et dans ce cas ça
ne compile pas.
Pour répondre à ta question dans le cadre du C++ (pour le C, c'est
fr.comp.lang.c) :
Je ne vais pas sur fr.comp.lang.c car il s'agit d'un code source écrit en C++,
et tu sais aussi bien que moi que le compilateur travaille différemment en fct
du langage qu'on lui donne.
- pour une fonction, c'est fort simple :
Dans le mail, je précisais un champ d'une structure et non une méthode,
la surcharge aurait été très facile à faire et je ne pense pas que j'aurais
posé la question.
struct A
{
public:
void age();
void Age() { age(); }
};
Une structure est directement public que cela soit les méthodes ou les champs.
- pour une variable, c'est plus compliqué (Peut-être peut-on faire
quelque chose avec un "union" ?), mais a priori le cas est très rare
de toute façons, puisque généralement, une variable membre est privée.
L'union doit être nommée, et cela veut dire que si je veux accéder à mon champ,
je dois préfixer chaque accès par le nom de la variable du type de l'union.
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel :
typedef struct StructFun {
Ça, c'est sans aucun doute du C. A quoi vois-tu que cela est du C ?
int age; #define Age age
Et ça, j'espère que même les programmeurs C ne le font plus. Tu es en train de dire que partout dans ton programme, l'identifiant "Age" est un synonyme de "age". Dans l'exemple donné, il était demandé si il était possible d'implémenter
des alias sur des champs.
Si dans une autre classe, tu as deux membres "age" et "Age" : - soit cette autre classe est définie avant, et dans ce cas tu ne peux plus accéder à son membre "Age" ; - soit cette autre classe est définie après, et dans ce cas ça ne compile pas.
Pour répondre à ta question dans le cadre du C++ (pour le C, c'est fr.comp.lang.c) : Je ne vais pas sur fr.comp.lang.c car il s'agit d'un code source écrit en C++,
et tu sais aussi bien que moi que le compilateur travaille différemment en fct du langage qu'on lui donne.
- pour une fonction, c'est fort simple : Dans le mail, je précisais un champ d'une structure et non une méthode,
la surcharge aurait été très facile à faire et je ne pense pas que j'aurais posé la question.
struct A { public: void age(); void Age() { age(); } }; Une structure est directement public que cela soit les méthodes ou les champs.
- pour une variable, c'est plus compliqué (Peut-être peut-on faire quelque chose avec un "union" ?), mais a priori le cas est très rare de toute façons, puisque généralement, une variable membre est privée. L'union doit être nommée, et cela veut dire que si je veux accéder à mon champ,
je dois préfixer chaque accès par le nom de la variable du type de l'union.
Bonne soirée,
Stéphane
Jean-Marc Bourguet
Stephane Wirtel writes:
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel :
typedef struct StructFun { Ça, c'est sans aucun doute du C.
A quoi vois-tu que cela est du C ?
typedef struct StructFun {} StructFun;
est un idiome typique de C. En C++ les tags sont disponibles comme type directement et l'idiome n'est possible que parce qu'il y a des clauses particulieres pour le permettre.
struct StructFun {};
a le meme effet et est plus idiomatique en C++.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
<com.descasoft@wirtel.stephane>:
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
A quoi vois-tu que cela est du C ?
typedef struct StructFun {} StructFun;
est un idiome typique de C. En C++ les tags sont disponibles
comme type directement et l'idiome n'est possible que parce qu'il y a
des clauses particulieres pour le permettre.
struct StructFun {};
a le meme effet et est plus idiomatique en C++.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel :
typedef struct StructFun { Ça, c'est sans aucun doute du C.
A quoi vois-tu que cela est du C ?
typedef struct StructFun {} StructFun;
est un idiome typique de C. En C++ les tags sont disponibles comme type directement et l'idiome n'est possible que parce qu'il y a des clauses particulieres pour le permettre.
struct StructFun {};
a le meme effet et est plus idiomatique en C++.
A+
-- Jean-Marc FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html Site de usenet-fr: http://www.usenet-fr.news.eu.org
Stephane Wirtel
Je ne vais pas sur fr.comp.lang.c car il s'agit d'un code source écrit en C++, et tu sais aussi bien que moi que le compilateur travaille différemment en fct du langage qu'on lui donne.
- pour une fonction, c'est fort simple :
Dans le mail, je précisais un champ d'une structure et non une méthode, la surcharge aurait été très facile à faire et je ne pense pas que j'aurais posé la question.
Une structure est directement public que cela soit les méthodes ou les champs.
- pour une variable, c'est plus compliqué (Peut-être peut-on faire quelque chose avec un "union" ?), mais a priori le cas est très rare de toute façons, puisque généralement, une variable membre est privée.
L'union doit être nommée, et cela veut dire que si je veux accéder à mon champ, je dois préfixer chaque accès par le nom de la variable du type de l'union. Effectivement, en relisant la doc, l'union anonyme permettrait d'accéder aux champs qu'elle recouvre.
Je ne vais pas sur fr.comp.lang.c car il s'agit d'un code source écrit
en C++,
et tu sais aussi bien que moi que le compilateur travaille différemment
en fct
du langage qu'on lui donne.
- pour une fonction, c'est fort simple :
Dans le mail, je précisais un champ d'une structure et non une méthode,
la surcharge aurait été très facile à faire et je ne pense pas que j'aurais
posé la question.
Une structure est directement public que cela soit les méthodes ou les
champs.
- pour une variable, c'est plus compliqué (Peut-être peut-on faire
quelque chose avec un "union" ?), mais a priori le cas est très rare
de toute façons, puisque généralement, une variable membre est privée.
L'union doit être nommée, et cela veut dire que si je veux accéder à mon
champ,
je dois préfixer chaque accès par le nom de la variable du type de l'union.
Effectivement, en relisant la doc, l'union anonyme permettrait d'accéder aux champs qu'elle recouvre.
Je ne vais pas sur fr.comp.lang.c car il s'agit d'un code source écrit en C++, et tu sais aussi bien que moi que le compilateur travaille différemment en fct du langage qu'on lui donne.
- pour une fonction, c'est fort simple :
Dans le mail, je précisais un champ d'une structure et non une méthode, la surcharge aurait été très facile à faire et je ne pense pas que j'aurais posé la question.
Une structure est directement public que cela soit les méthodes ou les champs.
- pour une variable, c'est plus compliqué (Peut-être peut-on faire quelque chose avec un "union" ?), mais a priori le cas est très rare de toute façons, puisque généralement, une variable membre est privée.
L'union doit être nommée, et cela veut dire que si je veux accéder à mon champ, je dois préfixer chaque accès par le nom de la variable du type de l'union. Effectivement, en relisant la doc, l'union anonyme permettrait d'accéder aux champs qu'elle recouvre.
Stephane Wirtel
Stephane Wirtel writes:
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel :
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
A quoi vois-tu que cela est du C ?
typedef struct StructFun {} StructFun;
est un idiome typique de C. En C++ les tags sont disponibles comme type directement et l'idiome n'est possible que parce qu'il y a des clauses particulieres pour le permettre.
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel
<com.descasoft@wirtel.stephane>:
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
A quoi vois-tu que cela est du C ?
typedef struct StructFun {} StructFun;
est un idiome typique de C. En C++ les tags sont disponibles
comme type directement et l'idiome n'est possible que parce qu'il y a
des clauses particulieres pour le permettre.
On Tue, 18 Oct 2005 15:04:00 +0200, Stephane Wirtel :
typedef struct StructFun {
Ça, c'est sans aucun doute du C.
A quoi vois-tu que cela est du C ?
typedef struct StructFun {} StructFun;
est un idiome typique de C. En C++ les tags sont disponibles comme type directement et l'idiome n'est possible que parce qu'il y a des clauses particulieres pour le permettre.
struct StructFun {};
a le meme effet et est plus idiomatique en C++.
A+
Merci Jean-Marc,
Franck Branjonneau
Stephane Wirtel écrivait:
- pour une variable, c'est plus compliqué (Peut-être peut-on faire quelque chose avec un "union" ?), mais a priori le cas est très rare de toute façons, puisque généralement, une variable membre est privée.
En utilisant une référence ?
L'union doit être nommée, et cela veut dire que si je veux accéder à mon champ, je dois préfixer chaque accès par le nom de la variable du type de l'union.
Effectivement, en relisant la doc, l'union anonyme permettrait d'accéder aux champs qu'elle recouvre.
Mais n'est-ce pas du comportement indéfini ? -- Franck Branjonneau
- pour une variable, c'est plus compliqué (Peut-être peut-on faire
quelque chose avec un "union" ?), mais a priori le cas est très
rare de toute façons, puisque généralement, une variable membre
est privée.
En utilisant une référence ?
L'union doit être nommée, et cela veut dire que si je veux accéder
à mon champ, je dois préfixer chaque accès par le nom de la
variable du type de l'union.
Effectivement, en relisant la doc, l'union anonyme permettrait
d'accéder aux champs qu'elle recouvre.
Mais n'est-ce pas du comportement indéfini ?
--
Franck Branjonneau <fasbjx@free.fr>
- pour une variable, c'est plus compliqué (Peut-être peut-on faire quelque chose avec un "union" ?), mais a priori le cas est très rare de toute façons, puisque généralement, une variable membre est privée.
En utilisant une référence ?
L'union doit être nommée, et cela veut dire que si je veux accéder à mon champ, je dois préfixer chaque accès par le nom de la variable du type de l'union.
Effectivement, en relisant la doc, l'union anonyme permettrait d'accéder aux champs qu'elle recouvre.
Mais n'est-ce pas du comportement indéfini ? -- Franck Branjonneau
Fabien LE LEZ
On Tue, 18 Oct 2005 17:07:51 +0200, Stephane Wirtel :
A quoi vois-tu que cela est du C ?
typedef struct StructFun { ... } StructFun;
Idiome classique en C. Je crois bien que c'est interdit en C++.
Et ça, j'espère que même les programmeurs C ne le font plus. Tu es en train de dire que partout dans ton programme, l'identifiant "Age" est un synonyme de "age". Dans l'exemple donné, il était demandé si il était possible d'implémenter
des alias sur des champs.
Certes. Mais "#define" est trop bourrin. Maintenant, tu fais ce que tu veux, du moment que tu ne me demandes pas de faire fonctionner le résultat.
Une structure est directement public que cela soit les méthodes ou les champs.
Il n'y a pas de notion de "structure" en C++.
Tu peux décréter que tous les membres d'une classe sont publics, mais c'est tout de même relativement rare.
On Tue, 18 Oct 2005 17:07:51 +0200, Stephane Wirtel
<com.descasoft@wirtel.stephane>:
A quoi vois-tu que cela est du C ?
typedef struct StructFun { ... } StructFun;
Idiome classique en C. Je crois bien que c'est interdit en C++.
Et ça, j'espère que même les programmeurs C ne le font plus.
Tu es en train de dire que partout dans ton programme, l'identifiant
"Age" est un synonyme de "age".
Dans l'exemple donné, il était demandé si il était possible d'implémenter
des alias sur des champs.
Certes. Mais "#define" est trop bourrin. Maintenant, tu fais ce que tu
veux, du moment que tu ne me demandes pas de faire fonctionner le
résultat.
Une structure est directement public que cela soit les méthodes ou les champs.
Il n'y a pas de notion de "structure" en C++.
Tu peux décréter que tous les membres d'une classe sont publics, mais
c'est tout de même relativement rare.
On Tue, 18 Oct 2005 17:07:51 +0200, Stephane Wirtel :
A quoi vois-tu que cela est du C ?
typedef struct StructFun { ... } StructFun;
Idiome classique en C. Je crois bien que c'est interdit en C++.
Et ça, j'espère que même les programmeurs C ne le font plus. Tu es en train de dire que partout dans ton programme, l'identifiant "Age" est un synonyme de "age". Dans l'exemple donné, il était demandé si il était possible d'implémenter
des alias sur des champs.
Certes. Mais "#define" est trop bourrin. Maintenant, tu fais ce que tu veux, du moment que tu ne me demandes pas de faire fonctionner le résultat.
Une structure est directement public que cela soit les méthodes ou les champs.
Il n'y a pas de notion de "structure" en C++.
Tu peux décréter que tous les membres d'une classe sont publics, mais c'est tout de même relativement rare.
kanze
Fabien LE LEZ wrote:
On Tue, 18 Oct 2005 17:07:51 +0200, Stephane Wirtel :
A quoi vois-tu que cela est du C ?
typedef struct StructFun { ... } StructFun;
Idiome classique en C. Je crois bien que c'est interdit en C++.
Il y a des règles spéciales pour le permettre. Qui sert dans le cas où il faut écrire des en-têtes communs aux deux langages. Autrement, effectivement, on n'écrit pas ça en C++ pûr, même si c'est permis.
Et ça, j'espère que même les programmeurs C ne le font plus. Tu es en train de dire que partout dans ton programme, l'identifiant "Age" est un synonyme de "age".
Dis-le plus clairement -- la portée de l'alias n'est pas que la struct, mais partout. Le #define fout la merde chez d'autres.
Dans l'exemple donné, il était demandé si il était possible d'implémenter des alias sur des champs.
Certes. Mais "#define" est trop bourrin. Maintenant, tu fais ce que tu veux, du moment que tu ne me demandes pas de faire fonctionner le résultat.
Une structure est directement public que cela soit les méthodes ou les champs.
Il n'y a pas de notion de "structure" en C++.
Mais si : §9/4 : « A structure is a class definewith the class-key struct; [...] ». En revanche, je ne crois pas que la norme utilise le mot autrement, même si elle le définit.
Note que : 1) une structure « estUne » classe, l'ensemble des structures dans un programme est un sous-ensemble des classes, et 2) dans la declaration anticipée « struct X ; », tu ne sais pas si X est une structure ou non (mais vue que le concepte ne sert pas, bien qu'étant défini, tu t'en fous).
Plus amusant, une « POD-struct » n'est pas forcement une structure. C'est une classe qui n'est pas une union, et qui remplit un certain nombre d'autres conditions.
AMHA : la nomenclature ici n'est pas aussi bien qu'elle pourrait l'être. Je ne vois pas l'intérêt de définir « structure » ; la phrase citée ci-dessus pourrait aussi bien dire : « If a class is defined with the class-key struct, its members and base classes a public by default. » Et personellement, je n'aurais pas dit qu'une union est une classe, pour ensuite dresser la liste des différences, mais l'inverse : j'aurais défini union comme une catégorie de type à part, pour ensuite citer les ressemblances qu'elle a avec des classes.
Tu peux décréter que tous les membres d'une classe sont publics, mais c'est tout de même relativement rare.
Ça dépend. Je le fais chaque fois que je dois interfacer avec du code C. Ce qui n'est pas si rare que ça ; l'API de ma plate-forme est spécifiée en C.
-- 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
Fabien LE LEZ wrote:
On Tue, 18 Oct 2005 17:07:51 +0200, Stephane Wirtel
<com.descasoft@wirtel.stephane>:
A quoi vois-tu que cela est du C ?
typedef struct StructFun { ... } StructFun;
Idiome classique en C. Je crois bien que c'est interdit en
C++.
Il y a des règles spéciales pour le permettre. Qui sert dans le
cas où il faut écrire des en-têtes communs aux deux langages.
Autrement, effectivement, on n'écrit pas ça en C++ pûr, même si
c'est permis.
Et ça, j'espère que même les programmeurs C ne le font
plus. Tu es en train de dire que partout dans ton
programme, l'identifiant "Age" est un synonyme de "age".
Dis-le plus clairement -- la portée de l'alias n'est pas que la
struct, mais partout. Le #define fout la merde chez d'autres.
Dans l'exemple donné, il était demandé si il était possible
d'implémenter des alias sur des champs.
Certes. Mais "#define" est trop bourrin. Maintenant, tu fais
ce que tu veux, du moment que tu ne me demandes pas de faire
fonctionner le résultat.
Une structure est directement public que cela soit les
méthodes ou les champs.
Il n'y a pas de notion de "structure" en C++.
Mais si : §9/4 : « A structure is a class definewith the
class-key struct; [...] ». En revanche, je ne crois pas que la
norme utilise le mot autrement, même si elle le définit.
Note que : 1) une structure « estUne » classe, l'ensemble des
structures dans un programme est un sous-ensemble des classes,
et 2) dans la declaration anticipée « struct X ; », tu ne sais
pas si X est une structure ou non (mais vue que le concepte ne
sert pas, bien qu'étant défini, tu t'en fous).
Plus amusant, une « POD-struct » n'est pas forcement une
structure. C'est une classe qui n'est pas une union, et qui
remplit un certain nombre d'autres conditions.
AMHA : la nomenclature ici n'est pas aussi bien qu'elle pourrait
l'être. Je ne vois pas l'intérêt de définir « structure » ; la
phrase citée ci-dessus pourrait aussi bien dire : « If a class
is defined with the class-key struct, its members and base
classes a public by default. » Et personellement, je n'aurais
pas dit qu'une union est une classe, pour ensuite dresser la
liste des différences, mais l'inverse : j'aurais défini union
comme une catégorie de type à part, pour ensuite citer les
ressemblances qu'elle a avec des classes.
Tu peux décréter que tous les membres d'une classe sont
publics, mais c'est tout de même relativement rare.
Ça dépend. Je le fais chaque fois que je dois interfacer avec du
code C. Ce qui n'est pas si rare que ça ; l'API de ma
plate-forme est spécifiée en C.
--
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
On Tue, 18 Oct 2005 17:07:51 +0200, Stephane Wirtel :
A quoi vois-tu que cela est du C ?
typedef struct StructFun { ... } StructFun;
Idiome classique en C. Je crois bien que c'est interdit en C++.
Il y a des règles spéciales pour le permettre. Qui sert dans le cas où il faut écrire des en-têtes communs aux deux langages. Autrement, effectivement, on n'écrit pas ça en C++ pûr, même si c'est permis.
Et ça, j'espère que même les programmeurs C ne le font plus. Tu es en train de dire que partout dans ton programme, l'identifiant "Age" est un synonyme de "age".
Dis-le plus clairement -- la portée de l'alias n'est pas que la struct, mais partout. Le #define fout la merde chez d'autres.
Dans l'exemple donné, il était demandé si il était possible d'implémenter des alias sur des champs.
Certes. Mais "#define" est trop bourrin. Maintenant, tu fais ce que tu veux, du moment que tu ne me demandes pas de faire fonctionner le résultat.
Une structure est directement public que cela soit les méthodes ou les champs.
Il n'y a pas de notion de "structure" en C++.
Mais si : §9/4 : « A structure is a class definewith the class-key struct; [...] ». En revanche, je ne crois pas que la norme utilise le mot autrement, même si elle le définit.
Note que : 1) une structure « estUne » classe, l'ensemble des structures dans un programme est un sous-ensemble des classes, et 2) dans la declaration anticipée « struct X ; », tu ne sais pas si X est une structure ou non (mais vue que le concepte ne sert pas, bien qu'étant défini, tu t'en fous).
Plus amusant, une « POD-struct » n'est pas forcement une structure. C'est une classe qui n'est pas une union, et qui remplit un certain nombre d'autres conditions.
AMHA : la nomenclature ici n'est pas aussi bien qu'elle pourrait l'être. Je ne vois pas l'intérêt de définir « structure » ; la phrase citée ci-dessus pourrait aussi bien dire : « If a class is defined with the class-key struct, its members and base classes a public by default. » Et personellement, je n'aurais pas dit qu'une union est une classe, pour ensuite dresser la liste des différences, mais l'inverse : j'aurais défini union comme une catégorie de type à part, pour ensuite citer les ressemblances qu'elle a avec des classes.
Tu peux décréter que tous les membres d'une classe sont publics, mais c'est tout de même relativement rare.
Ça dépend. Je le fais chaque fois que je dois interfacer avec du code C. Ce qui n'est pas si rare que ça ; l'API de ma plate-forme est spécifiée en C.
-- 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
Fabien LE LEZ
On 19 Oct 2005 00:34:47 -0700, "kanze" :
AMHA : la nomenclature ici n'est pas aussi bien qu'elle pourrait l'être. Je ne vois pas l'intérêt de définir « structure »
Franchement, quitte à récupérer l'héritage de C, je trouve qu'on aurait aussi bien fait de garder juste la notion de "structure", avec le mot-clé "struct", plutôt qu'avoir les deux mots "presque synonymes" que sont "struct" et "class". En l'état actuel du langage, on pourrait se passer totalement du mot-clé "class" sans perte de fonctionnalité.
On 19 Oct 2005 00:34:47 -0700, "kanze" <kanze@gabi-soft.fr>:
AMHA : la nomenclature ici n'est pas aussi bien qu'elle pourrait
l'être. Je ne vois pas l'intérêt de définir « structure »
Franchement, quitte à récupérer l'héritage de C, je trouve qu'on
aurait aussi bien fait de garder juste la notion de "structure", avec
le mot-clé "struct", plutôt qu'avoir les deux mots "presque synonymes"
que sont "struct" et "class".
En l'état actuel du langage, on pourrait se passer totalement du
mot-clé "class" sans perte de fonctionnalité.
AMHA : la nomenclature ici n'est pas aussi bien qu'elle pourrait l'être. Je ne vois pas l'intérêt de définir « structure »
Franchement, quitte à récupérer l'héritage de C, je trouve qu'on aurait aussi bien fait de garder juste la notion de "structure", avec le mot-clé "struct", plutôt qu'avoir les deux mots "presque synonymes" que sont "struct" et "class". En l'état actuel du langage, on pourrait se passer totalement du mot-clé "class" sans perte de fonctionnalité.
James Kanze
Fabien LE LEZ wrote:
On 19 Oct 2005 00:34:47 -0700, "kanze" :
AMHA : la nomenclature ici n'est pas aussi bien qu'elle pourrait l'être. Je ne vois pas l'intérêt de définir « structure »
Franchement, quitte à récupérer l'héritage de C, je trouve qu'on aurait aussi bien fait de garder juste la notion de "structure", avec le mot-clé "struct", plutôt qu'avoir les deux mots "presque synonymes" que sont "struct" et "class".
Je ne me rappelle plus la raisonnement, mais j'ai bien lu quelque part qu'on avait considéré la possibilité, et que la décision de fusionner les deux conceptes était intentionnelle.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Fabien LE LEZ wrote:
On 19 Oct 2005 00:34:47 -0700, "kanze" <kanze@gabi-soft.fr>:
AMHA : la nomenclature ici n'est pas aussi bien qu'elle
pourrait l'être. Je ne vois pas l'intérêt de définir «
structure »
Franchement, quitte à récupérer l'héritage de C, je trouve
qu'on aurait aussi bien fait de garder juste la notion de
"structure", avec le mot-clé "struct", plutôt qu'avoir les
deux mots "presque synonymes" que sont "struct" et "class".
Je ne me rappelle plus la raisonnement, mais j'ai bien lu
quelque part qu'on avait considéré la possibilité, et que la
décision de fusionner les deux conceptes était intentionnelle.
--
James Kanze mailto: james.kanze@free.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
AMHA : la nomenclature ici n'est pas aussi bien qu'elle pourrait l'être. Je ne vois pas l'intérêt de définir « structure »
Franchement, quitte à récupérer l'héritage de C, je trouve qu'on aurait aussi bien fait de garder juste la notion de "structure", avec le mot-clé "struct", plutôt qu'avoir les deux mots "presque synonymes" que sont "struct" et "class".
Je ne me rappelle plus la raisonnement, mais j'ai bien lu quelque part qu'on avait considéré la possibilité, et que la décision de fusionner les deux conceptes était intentionnelle.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34