OVH Cloud OVH Cloud

pointeurs de fonctions membre static, ca bloque :-(

15 réponses
Avatar
pasde.hcyrano.spam
bonsoir, je n'arrive pas a resoudre mon prob

/* pseudo code */

class MaClass {

/* static */

static bool check_A1(const int data);
static bool check_A2(const int data);
static bool check_A3(const int data);

static init_check();

/* comment declarer le tableau de pointeur de fonction membre static */

static bool (MaClass::*check[64])(const int discs_player); // ?????????


/* membre */

int discs[10];
int player;

bool uneMethode();

}

bool MaClass::check_A1(const int data) { .../...}
bool MaClass::check_A2(const int data) { .../...}
bool MaClass::check_A3(const int data) { .../...}

void MaClass::init_check() {
check[A1] = &MaClass::check_A1;
check[A2] = &MaClass::check_A2;
check[A3] = &MaClass::check_A2;
}

bool MaClass::uneMethode(int p) {

.../...

/*comment appeler une fonction de MaClass::check[] */

if((*(Maclass::check[p]))(discs[player])) { // ????????
.../...
}

.../...
}

merci pour votre aide
--
Bruno Causse
http://perso.wanadoo.fr/othello

5 réponses

1 2
Avatar
Jean-Claude Arbaut
Olivier Miakinen wrote:

Je te comprends. Bien qu'ayant quelques années d'expérience en C++, je
ne comprends toujours pas grand-chose aux pointeurs de fonctions. Ça
fait partie des "coins poussiéreux" du langage, dont je ne me sers
quasiment jamais.


C'est très différent des pointeurs de fonction du C ?



Si j'ai bien compris leurs réponses, Matthieu et kanze avaient l'air de
penser que non.

Mais je pense que, dans de nombreux cas où l'utilisation de pointeurs
de fonctions peut s'avérer utile en C, on pourrait s'en sortir avec des
sous-classes et des fonctions virtuelles en C++.


C'est d'ailleurs la seule possibilité en Java.

C'est en ce sens que je
comprends la remarque de Fabien : ça existe, il y a probablement des cas
où ce sera utile même en C++, mais il n'a quasiment jamais rencontré de
tels cas.


Ok, comme je connais beaucoup mieux C et Java que C++, je me posais des
questions ;-)



Avatar
Jean-Marc Bourguet
Jean-Claude Arbaut writes:

Fabien LE LEZ wrote:
On Wed, 14 Jun 2006 15:33:28 +0200, Bruno CAUSSE :

Mais c'est loin d'etre evident pour le simple boetien que je suis.
Je te comprends. Bien qu'ayant quelques années d'expérience en C++, je

ne comprends toujours pas grand-chose aux pointeurs de fonctions. Ça
fait partie des "coins poussiéreux" du langage, dont je ne me sers
quasiment jamais.



C'est très différent des pointeurs de fonction du C ?


Si on exclus les differences syntaxiques en considerant que this est
un parametre, la grosse difference est qu'on peut pointer vers un
membre virtuel, auquel cas l'appel tiendra compte du type dynamique de
l'objet.

L'utilisation la plus courante me semble etre dans les contextes de
callbacks (mais pourquoi ne pas utiliser une bibliotheque existante
qui masque ca, genre libsig++, boost::signals, boost::function ?).

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



Avatar
Fabien LE LEZ
On Thu, 15 Jun 2006 16:53:20 +0200, Olivier Miakinen :

C'est en ce sens que je
comprends la remarque de Fabien : ça existe, il y a probablement des cas
où ce sera utile même en C++, mais il n'a quasiment jamais rencontré de
tels cas.


Je confirme. En fait, j'ai déjà rencontré de tels cas : lors de
l'utilisation d'une bibliothèque écrite en C. En particulier, l'API
Windows.

Avatar
Jean-Claude Arbaut
Jean-Marc Bourguet wrote:
Jean-Claude Arbaut writes:


Fabien LE LEZ wrote:

On Wed, 14 Jun 2006 15:33:28 +0200, Bruno CAUSSE :


Mais c'est loin d'etre evident pour le simple boetien que je suis.


Je te comprends. Bien qu'ayant quelques années d'expérience en C++, je
ne comprends toujours pas grand-chose aux pointeurs de fonctions. Ça
fait partie des "coins poussiéreux" du langage, dont je ne me sers
quasiment jamais.



C'est très différent des pointeurs de fonction du C ?



Si on exclus les differences syntaxiques en considerant que this est
un parametre, la grosse difference est qu'on peut pointer vers un
membre virtuel, auquel cas l'appel tiendra compte du type dynamique de
l'objet.


Ah, oui, ça c'est une différence assez importante !

L'utilisation la plus courante me semble etre dans les contextes de
callbacks (mais pourquoi ne pas utiliser une bibliotheque existante
qui masque ca, genre libsig++, boost::signals, boost::function ?).

A+






Avatar
kanze
Jean-Marc Bourguet wrote:
Jean-Claude Arbaut writes:

Fabien LE LEZ wrote:
On Wed, 14 Jun 2006 15:33:28 +0200, Bruno CAUSSE :

Mais c'est loin d'etre evident pour le simple boetien que
je suis.
Je te comprends. Bien qu'ayant quelques années

d'expérience en C++, je ne comprends toujours pas
grand-chose aux pointeurs de fonctions. Ça fait partie des
"coins poussiéreux" du langage, dont je ne me sers
quasiment jamais.


C'est très différent des pointeurs de fonction du C ?


Si on exclus les differences syntaxiques en considerant que
this est un parametre, la grosse difference est qu'on peut
pointer vers un membre virtuel, auquel cas l'appel tiendra
compte du type dynamique de l'objet.

L'utilisation la plus courante me semble etre dans les
contextes de callbacks (mais pourquoi ne pas utiliser une
bibliotheque existante qui masque ca, genre libsig++,
boost::signals, boost::function ?).


Je m'en suis servi plusieurs fois, soit pour des callbacks,
soit, plus souvent, pour des appels à travers des tableaux
(indicés par un caractère, par exemple). Mais si je régarde
bien, il s'avère que dans prèsque tous les cas, j'ai fini par
les remplacer par des objets fonctionnels (souvent avec une
classe de base abstraite) -- au fur et à mesure que le programme
se dévoloppait, je finissais par avoir des cas où je voulais
avoir la même fonction, mais avec un paramètre différent, ou
quelque chose de ce genre.

À titre d'exemple :
http://kanze.james.neuf.fr/code/Util/Text/CharacterClass/cclsParse.cc,
le parseur de ma classe CharacterClass. (C'est un SetOfCharacter
avec un constructeur qui accepte des chaînes du genre "[a-z]" ou
"n". La documentation s'en trouve à
http://kanze.james.neuf.fr/doc/en/Text/html/index.html.) Dans
les versions originales, il y a tant d'années, il y avait un
tableau des

struct Init
{
int character ;
char (Parser::* handler)( streambuf* source ) const ;
} ;

Une recherche sur le caractère après le '' comme key me donner
l'adresse d'une fonction member à appeler. Aujourd'hui, les
éléments du tableau sont :

struct Init
{
int character ;
EscapeParser const* handler ;
} ;

où EscapeParser est une classe abstraite. C'est plus à écrire au
départ, parce qu'il faut définir EscapeParser, puis définir une
classe qui en dérive pour chaque cas particulier. Mais le
traitement des 'a', 'b', etc. ne diffère que du paramètre du
constructeur, de même que les traitements des 'x', 'u' et
'U' (et même les '').

--
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




1 2