OVH Cloud OVH Cloud

méthode statique

27 réponses
Avatar
Nicolas Aunai
salut,


je comprends l'intéret d'une variable static dans une classe, mais pas
celui d'une méthode static... que sont-elles et à quoi servent-elles ?

merci

--
Nico,
http://astrosurf.com/nicoastro
messenger : nicolas_aunai@hotmail.com

10 réponses

1 2 3
Avatar
Ivan Vecerina
"Nicolas Aunai" wrote in message
news:
| salut,
|
| je comprends l'intéret d'une variable static dans une classe, mais pas
| celui d'une méthode static... que sont-elles et à quoi servent-elles ?

Atouts d'une méthode statique:
- peut être protected ou privée (restrictions d'accès).
- permet d'encapsuler l'accès à des variables static de la classe.
- permet de définir des fonctions utilitaires en rapport étroit avec
la classe, mais qui n'agit pas sur un objet spécifique.
ConnexionInternet::FermezToutesLesConnexions();
- utile également pour certains patterns de programmation
avec les templates: voir "policy classes", std::allocator, etc.


Salut,
Ivan
--
http://ivan.vecerina.com/contact/?subject=NG_POST <- e-mail contact form
Brainbench MVP for C++ <> http://www.brainbench.com
Avatar
James Kanze
Nicolas Aunai writes:

|> je comprends l'intéret d'une variable static dans une classe,
|> mais pas celui d'une méthode static... que sont-elles et à
|> quoi servent-elles ?

Elles sont des fonctions membres auxquelles on ne passe pas de pointeur
this. Elles ont des utilisations diverses : une fonction usine ou la
fonction instance d'un singleton en sont des examples classiques. Je les
utilise aussi assez souvent pour la construction des membres, dans le
cas où c'est trop complex à mettre dans une expression simple, ou
pour la validation des paramètres du constructeur.

--
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
Anubis
James Kanze wrote:

Nicolas Aunai writes:

je comprends l'intéret d'une variable static dans une classe,
mais pas celui d'une méthode static... que sont-elles et à
quoi servent-elles ?


Elles sont des fonctions membres auxquelles on ne passe pas de pointeur
this.


Le fait qu'elles n'aient pas le pointeur this par défaut en fait surtout
des fonctions (et non pas des méthodes) qui sont simplement encapsulées
dans la classe comme des fonctions le seraient dans un namespace.

Le gros avantage est qu'une méthode statique est en tout point similaire
à une fonction (pointeurs, appels, etc).

Il est généralement nécessaire d'y avoir recours pour des
fonctionnalités encapsulées dans une classe mais nécessitant un passage
de pointeur sur fonction (pour un classe CThread par exemple).

--
Vincent


Avatar
Julien IBARZ
Le gros avantage est qu'une méthode statique est en tout point similaire
à une fonction (pointeurs, appels, etc).

Il est généralement nécessaire d'y avoir recours pour des
fonctionnalités encapsulées dans une classe mais nécessitant un passage
de pointeur sur fonction (pour un classe CThread par exemple).


A moins que je n'ai pas compris votre propos, il est tout à fait
possible de faire des pointeurs vers des méthodes de classes non statiques.

Avatar
Alain Naigeon
"Julien IBARZ" a écrit dans le message news:
4027f7b6$0$28274$

Le gros avantage est qu'une méthode statique est en tout point similaire
à une fonction (pointeurs, appels, etc).

Il est généralement nécessaire d'y avoir recours pour des
fonctionnalités encapsulées dans une classe mais nécessitant un passage
de pointeur sur fonction (pour un classe CThread par exemple).


A moins que je n'ai pas compris votre propos, il est tout à fait
possible de faire des pointeurs vers des méthodes de classes non
statiques.


Vi vi, vu que pas mal de gens ici savent ça, il semble qu'effectivement
le propos t'ait échappé - mais c'est pas grave, on ne peut pas suivre
tout dans les moindres détails.

--

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


Avatar
kanze
Anubis wrote in message
news:<c08k47$siq$...
James Kanze wrote:

Nicolas Aunai writes:

je comprends l'intéret d'une variable static dans une classe,
mais pas celui d'une méthode static... que sont-elles et à quoi
servent-elles ?


Elles sont des fonctions membres auxquelles on ne passe pas de
pointeur this.


Le fait qu'elles n'aient pas le pointeur this par défaut en fait
surtout des fonctions (et non pas des méthodes) qui sont simplement
encapsulées dans la classe comme des fonctions le seraient dans un
namespace.


Elles ont bien accès à la partie privée de la classe. Elles font partie
integrale de l'interface de la classe.

Le gros avantage est qu'une méthode statique est en tout point
similaire à une fonction (pointeurs, appels, etc).


Le gros avantage, par rapport à une fonction non-membre, c'est qu'elle a
accès à la partie privée de la classe. Le gros avantage, par rapport à
une fonction membre non-statique, c'est qu'elle peut être appelée sans
instance de la classe.

Il est généralement nécessaire d'y avoir recours pour des
fonctionnalités encapsulées dans une classe mais nécessitant un
passage de pointeur sur fonction (pour un classe CThread par exemple).


C'est en effet une des utilisations importantes, mais pas la seule. Je
dirais que la vaste majorité de mes fonctions statiques sont ou bien des
fonctions usine d'une sorte ou une autre, y comprise l'instance() du
singleton, ou bien des fonctions de « prétraitement » des paramètres
d'un constructeur. J'ai aussi un ou deux cas particuliers, qui me
servent dans une RTTI portable fait maison. Et une fois, évidemment, la
fonction que je passe à pthread_create. (Mais je fais des serveurs, sans
GUI. Je crois que dans les GUI, il y a beaucoup plus de callback.)

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16



Avatar
Andre Heinen
Si tu as le Stroustrup, tu trouveras un exemple simple de
fonction statique en 10.2.4. Si tu n'as pas le Stroustrup, va
l'acheter.

Les usines et singletons dont nous parle James Kanze me
paraissent être les meilleurs exemples. Va sur Google et cherche
"design patterns", "factory", etc... Je pense que tu dois
également pouvoir trouver des exemples C++ dans le bouquin de
Bruce Eckel, que tu peux downloader sur
http://mindview.net/Books/TICPP/ThinkingInCPP2e.html
(Je ne sais pas s'il a été traduit en français.)

--
Andre Heinen
My address is "a dot heinen at europeanlink dot com"
Avatar
Gourgouilloult

Le gros avantage est qu'une méthode statique est en tout point similaire
à une fonction (pointeurs, appels, etc).

Il est généralement nécessaire d'y avoir recours pour des
fonctionnalités encapsulées dans une classe mais nécessitant un passage
de pointeur sur fonction (pour un classe CThread par exemple).


A moins que je n'ai pas compris votre propos, il est tout à fait
possible de faire des pointeurs vers des méthodes de classes non
statiques.


Vi vi, vu que pas mal de gens ici savent ça, il semble qu'effectivement
le propos t'ait échappé - mais c'est pas grave, on ne peut pas suivre
tout dans les moindres détails.


Plus explicitement, la partie importante était «en tout point similaire
à une fonction». Ce n'est pas nécessairement vrai à tout point de vue,
mais au moins sur le fait qu'on ne peut pas mettre un pointeur de
fonction membre là où on attend un pointeur de fonction libre et vice versa.

J'ai en ce moment même l'exemple d'une API orientée C (SDL, pour ne pas
la nommer), qui demande qu'on lui passe un pointeur de fonction, qu'elle
puisse utiliser comme callback. Tel que le code a été conçu jusque là,
la fonction concernée est évidemment un membre d'une classe. Seulement,
SDL n'ayant pas les moyens d'appeler son callback «sur un objet», il
faut que cette fonction soit statique. (C'est à peu près la même chose
que pour pthread_create(), en somme.)

Par contre, ma solution actuelle utilise un truc pas très joli, pour
permettre au callback d'accéder aux données de l'unique objet de cette
classe : une variable globale. Si j'essaye de schématiser, ça nous donne
quelque chose comme :

class A {
public:
A () {
// ...
objet_sdl.callback = mon_callback;
objet_sdl.pseudo_this = 0; // utilisé comme argument
};

private:
type_sdl objet_sdl;
int i; // diverses données

static void mon_callback (void* pseudo_this, int& p);
// pas grand chose en paramètres
};

A le_A; // promis, c'est pas de moi ;-P

void A::mon_callback (void* pseudo_this, int& p) {
// ...
p = le_A.i; // des choses du genre
}

A part «c'est moche», qu'est-ce que vous en pensez ? Je devrais utiliser
le paramètre prévu par SDL pour tenir lieu de this (mais c'est un void*
!- ) ? Je fais de ma variable globale un membre statique ? (Ah mais
non, j'ai pas prévu d'en faire un pointeur...) Je change ma classe en
namespace ? Autre chose ? Ou bien je garde ce que j'ai et j'arrête de
poser des questions bêtes ?-)

Gourgou



Avatar
adebaene
Julien IBARZ wrote in message news:<4027f7b6$0$28274$...
Le gros avantage est qu'une méthode statique est en tout point similaire
à une fonction (pointeurs, appels, etc).

Il est généralement nécessaire d'y avoir recours pour des
fonctionnalités encapsulées dans une classe mais nécessitant un passage
de pointeur sur fonction (pour un classe CThread par exemple).


A moins que je n'ai pas compris votre propos, il est tout à fait
possible de faire des pointeurs vers des méthodes de classes non statiques.


Oui, mais toutes les APIs de threading que je connais attendent comme
fonction principale d'un thread un pointeur vers une fonction "libre",
qui est nécessairement une fonction statique si on veut la mettre dans
une classe.

Arnaud


Avatar
kanze
Gourgouilloult <gourgou_at_club-internet_point_fr> wrote in message

Par contre, ma solution actuelle utilise un truc pas très joli, pour
permettre au callback d'accéder aux données de l'unique objet de cette
classe : une variable globale. Si j'essaye de schématiser, ça nous donne
quelque chose comme :


Sans connaître plus, c'est difficile à dire. Surtout, il faudrait savoir
la signature exacte de la fonction à passer en callback.

class A {
public:
A () {
// ...
objet_sdl.callback = mon_callback;
objet_sdl.pseudo_this = 0; // utilisé comme argument
};

private:
type_sdl objet_sdl;
int i; // diverses données

static void mon_callback (void* pseudo_this, int& p);
// pas grand chose en paramètres
};

A le_A; // promis, c'est pas de moi ;-P

void A::mon_callback (void* pseudo_this, int& p) {
// ...
p = le_A.i; // des choses du genre
}

A part «c'est moche», qu'est-ce que vous en pensez ?


Si le callback a un paramètre, la meilleur solution est de s'en servir.
Comme on fait avec pthread_create:

class Thread
{
public:
void start() ;
virtual void run() = 0 ;

private:
pthread_t myId ;
} ;

extern "C" static void* threadStarter( void* obj )
{
static_cast< Thread* >( obj )->run() ;
return NULL ;
}

void
Thread::start()
{
if ( pthread_create( &myId, NULL, &threadStart, this ) != 0 ) {
// Traitement de l'erreur...
}
}

Note que dans ce cas-ci, il faut absolument une fonction avec linkage
"C". Une fonction membre, static ou non, ne marche pas. (Selon la norme,
je ne crois pas que ça doit compiler. Mais dans la pratique, je ne
connais pas de compilateur qui signale l'erreur si la fonction est
statique. Ce qui donne un comportement indéfini, qui a parfois l'air
même de marcher.)

Je devrais utiliser le paramètre prévu par SDL pour tenir lieu de this
(mais c'est un void* !- ) ?


C'est normal dans une interface C. Alors, il y a static_cast.

Je fais de ma variable globale un membre statique ? (Ah mais non, j'ai
pas prévu d'en faire un pointeur...) Je change ma classe en namespace
? Autre chose ? Ou bien je garde ce que j'ai et j'arrête de poser des
questions bêtes ?-)


La variable globale est à éviter. Si l'interface permet un paramètre à
la fonction, sers-t'en. Sinon, j'aurais tendance à préférer une variable
statique membre, mais il n'y a pas de solution vraiment propre.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16

1 2 3