OVH Cloud OVH Cloud

Méthodes static

8 réponses
Avatar
TigrouMeow
J'ai créé une méthode static dans ma classe.
Pour y faire appel, je fais ainsi :
MyClas::MyMethod();

En Java, je faisais directement :
MyClass.MyMethod();

Cela est-il normal ? Pour appeler une méthode static en C++, il faut
obligatoirement utiliser la syntaxe avec les deux points ?

Je vous remercie.

8 réponses

Avatar
Benoit Dejean
Le Mon, 06 Oct 2003 19:32:21 +0200, TigrouMeow a écrit :

J'ai créé une méthode static dans ma classe. Pour y faire appel, je
fais ainsi :
MyClas::MyMethod();


bien

En Java, je faisais directement :
MyClass.MyMethod();


typique de Java. soit disant on ne surcharge pas les opérateurs, mais
là, on garde le '.' . Personellement, je trouve le :: très clair, évite
les confusions. On aime ou on aime pas évidemment.

Cela est-il normal ?


c'est même voulu

Pour appeler une méthode static en C++, il faut obligatoirement
utiliser la syntaxe avec les deux points ?


oui

Avatar
Alain Naigeon
"TigrouMeow" a écrit dans le
message news: bls8sp$jho$
J'ai créé une méthode static dans ma classe.
Pour y faire appel, je fais ainsi :
MyClas::MyMethod();

En Java, je faisais directement :
MyClass.MyMethod();

Cela est-il normal ? Pour appeler une méthode static en C++, il faut
obligatoirement utiliser la syntaxe avec les deux points ?


Tu as déjà eu la réponse "oui", mais il me semble utile
d'éclairer un peu les raisons :
- la fonction doit être préfixée par quelque chose,
bien sûr, car elle n'est pas globale ;
- elle est préfixée par le nom de sa classe ;
- la syntaxe "." suppose la présence d'un *objet* avant
le point, et non d'une classe.

A part ça je ne connais pas les raisons du choix de ::
qui en vaut bien un autre, et que j'aime assez.

--

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

Avatar
Loïc Joly
Alain Naigeon wrote:

"TigrouMeow" a écrit dans le
message news: bls8sp$jho$

J'ai créé une méthode static dans ma classe.
Pour y faire appel, je fais ainsi :
MyClas::MyMethod();

En Java, je faisais directement :
MyClass.MyMethod();

Cela est-il normal ? Pour appeler une méthode static en C++, il faut
obligatoirement utiliser la syntaxe avec les deux points ?



Tu as déjà eu la réponse "oui", mais il me semble utile
d'éclairer un peu les raisons :
- la fonction doit être préfixée par quelque chose,
bien sûr, car elle n'est pas globale ;
- elle est préfixée par le nom de sa classe ;
- la syntaxe "." suppose la présence d'un *objet* avant
le point, et non d'une classe.


Et pour ajouter encore un peu :

Si tu as une instance de MyClass qui se nomme myClass, tu as deux
syntaxe possibles pour appeler ta fonction statique :
MyClass::MyMethod();
myClass.MyMethod();

Je ne sais pas trop à quoi peut servir la deuxième écriture, mais bon...

--
Loïc


Avatar
Marc Boyer
Alain Naigeon wrote:
"TigrouMeow" a écrit dans le
message news: bls8sp$jho$

A part ça je ne connais pas les raisons du choix de ::
qui en vaut bien un autre, et que j'aime assez.


Compatibilité avec le C (cf DnE 3.11.3 p95)
struct Object {...};

struct Object Object; // Definition de la variable Objet de type struct Objet

Object.x; // Object désigne-t-il la classe ou la variable ?

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(

Avatar
Alain Naigeon
"Marc Boyer" a écrit dans le message news:
bltvug$3ib$

struct Object Object; // Definition de la variable Objet de type struct
Objet


Object.x; // Object désigne-t-il la classe ou la variable ?


Vu l'ambigüité de noms, pour désigner la structure (type)
il faut AMHA la préfixer par struct.
Ce n'est pas le cas dans ton exemple, donc dans ta deuxième
ligne il me semble que Object désigne l'instance définie dans
la première ligne.
Enfin, j'ajoute (après parcours de la norme pour cette dernière
réponse, je l'avoue) : quand un nom de membre (supposé static
ici) est précédé de '.', alors le préfixe doit être un objet, et cela
me confirme qu'on est dans ce cas.
Si j'ai raison, alors
(struct Object).Object; // ou même struct Object.Object; ??
est non grammatical puisqu'il y a contradiction entre le premier
point (Vu...) et le dernier point (Enfin, ...) évoqués ci-dessus.

Ceci dit : un mec qui cultive ainsi l'ambigüité, tu le gardes
au-delà des 3 mois d'essai, ou pas ? [sauf bien sûr si tu es
président d'université et que c'est un examinateur pour C++ :-) ]

--

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

Avatar
Marc Boyer
Alain Naigeon wrote:
"Marc Boyer" a écrit dans le message news:
bltvug$3ib$

struct Object Object; // Definition de la variable Objet de type struct
Objet


Object.x; // Object désigne-t-il la classe ou la variable ?


Vu l'ambigüité de noms, pour désigner la structure (type)
il faut AMHA la préfixer par struct.


Il faut ? Au nom de quoi ? Si on parle de lisibilité,
oui, il vaut mieux. Si on parle de respect de la grammaire,
ben, il faut remonter à un temps ou C++ s'appellait C with classes
et ou se posait la question de savoir comment référencer un
membre statique.

Enfin, j'ajoute (après parcours de la norme pour cette dernière
réponse, je l'avoue) : quand un nom de membre (supposé static
ici) est précédé de '.', alors le préfixe doit être un objet, et cela
me confirme qu'on est dans ce cas.


Oui, mais tu lis la norme telle qu'elle existe. Moi je te
racontais juste ce que Stroustrup raconte dans DnE pour
justifier l'introduction de :: (donc en évoquant une
époque ou il n'existait pas).

Marc Boyer
--
Lying for having sex or lying for making war? Trust US presidents :-(


Avatar
Alain Naigeon
"Marc Boyer" a écrit dans le message news:
bm0dnc$gvk$
Alain Naigeon wrote:
"Marc Boyer" a écrit dans le message
news:


bltvug$3ib$

struct Object Object; // Definition de la variable Objet de type
struct



Objet

Object.x; // Object désigne-t-il la classe ou la variable ?


Vu l'ambigüité de noms, pour désigner la structure (type)
il faut AMHA la préfixer par struct.


Il faut ? Au nom de quoi ? Si on parle de lisibilité,
oui, il vaut mieux. Si on parle de respect de la grammaire,
ben, il faut remonter à un temps ou C++ s'appellait C with classes
et ou se posait la question de savoir comment référencer un
membre statique.


J'ai beaucoup de mal à comprendre ta réponse :
- certainement Object Object ; n'est pas une définition correcte !
- donc il faut mettre le struct devant ;
- ensuite struct Object.x ; est interdit et dénué de sens, il me semble ;
- enfin dans struct Object::x; je crois bien que struct serait superflu,
ou bien ai-je tort ici ?

Bref, peux-tu me sortir de la piscine où ta remarque m'a plongé ? ;-)
(je n'ai pas accès à toutes ces docs historiques, et je manque de
temps pour cause de déménagement dans 10 jours)

--

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



Avatar
Marc Boyer
Alain Naigeon wrote:
"Marc Boyer" a écrit dans le message news:
bm0dnc$gvk$
Alain Naigeon wrote:
Il faut ? Au nom de quoi ? Si on parle de lisibilité,
oui, il vaut mieux. Si on parle de respect de la grammaire,
ben, il faut remonter à un temps ou C++ s'appellait C with classes
et ou se posait la question de savoir comment référencer un
membre statique.


J'ai beaucoup de mal à comprendre ta réponse :
- certainement Object Object ; n'est pas une définition correcte !


Reprenons:
1) En C, le code suivant est correct
struct S {...};
struct S x;
struct S S;
2) En voulant faire C with classes, Stroustrup voulait que le
rappel de struct (ou class) dans une déclaration de variable soit
optionnel. Donc, accepter
struct S {...};
S x; // On est d'accord j'imagine
S S; // Accepté en C++, par homogénéité avec "S x;" et "struct S S";

- donc il faut mettre le struct devant ;


Non. Essaye avec ton compilo préféré.

- ensuite struct Object.x ; est interdit et dénué de sens, il me semble ;
- enfin dans struct Object::x; je crois bien que struct serait superflu,
ou bien ai-je tort ici ?


Tu as torts deux étapes au dessus.
Enfin bon, la compatibilité avec le C...

Marc Boyer (qui fait le savant parce qu'il est en train de lire le bon bouquin)
--
Lying for having sex or lying for making war? Trust US presidents :-(