Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pointeur de fonction membre static

7 réponses
Avatar
Bruno CAUSSE
Bonjour,

Comment declarer a l'interieur d'une classe un tableau de fonction membre
static. (je trouve bizarre de trouver des exemples ou ce tableau est externe
a la classe)

Un truc du genre,

MaClass {

.../...
Static int (MaClass::*fonction[100])() ;
Static init_fonction();
.../...

}

De meme pour les appels est il possible de prefixer par la classe comme les
membres static

(MaClass::*fonction[12])();

Cette ecriture me semble plus logique.

Merci (je n'ai pas outil de dev pour verifier maintenant).

7 réponses

Avatar
gbaudin
"Bruno CAUSSE" a écrit dans le message de news:
C0B442FA.1C326%
Bonjour,

Comment declarer a l'interieur d'une classe un tableau de fonction membre
static. (je trouve bizarre de trouver des exemples ou ce tableau est
externe
a la classe)

Un truc du genre,

MaClass {

.../...
Static int (MaClass::*fonction[100])() ;
Static init_fonction();
.../...

}

De meme pour les appels est il possible de prefixer par la classe comme
les
membres static

(MaClass::*fonction[12])();

Cette ecriture me semble plus logique.

Merci (je n'ai pas outil de dev pour verifier maintenant).



bonjour,
ca ne serais pas plus simple de faire un truc du genre :

typedef void (MaClass::*Funct)( void );
typedef std::list< Funct > ma_liste_de_fonction;

class MaClass
{
static int do_something_with_my_table ( ma_liste_de_fonction& maListe )
{
}

static void init_fonction()
{
}
};

Avatar
Bruno CAUSSE
dans l'article 448e8a08$0$1025$, gbaudin à
a écrit le 13/06/06 11:45 :

bonjour,
ca ne serais pas plus simple de faire un truc du genre :

typedef void (MaClass::*Funct)( void );
typedef std::list< Funct > ma_liste_de_fonction;

class MaClass
{
static int do_something_with_my_table ( ma_liste_de_fonction& maListe )
{
}

static void init_fonction()
{
}
};


Et maliste tu la declares ou? En dehors de la classe?
MaClass devrait la connaître puisque je la souhaite "static" a la classe.

static int do_something_with_my_table ()

Avatar
Bruno CAUSSE
dans l'article C0B442FA.1C326%, Bruno CAUSSE à
a écrit le 13/06/06 10:24 :

Bonjour,

Comment declarer a l'interieur d'une classe un tableau de fonction membre
static. (je trouve bizarre de trouver des exemples ou ce tableau est externe
a la classe)

Un truc du genre,

MaClass {

.../...

Static int (MaClass::*fonction[100])() ;
Static init_fonction();
.../...


}

De meme pour les appels est il possible de prefixer par la classe comme les
membres static

(MaClass::*fonction[12])();

Cette ecriture me semble plus logique.

Merci (je n'ai pas outil de dev pour verifier maintenant).



Un truc du genre fontionnerai?

typedef void (*Funct)( void );

class MaClass {

static Funct fonction[100];

};

que j'utiliserai (apres init) par

(MaClass::*fonction[id])();

Avatar
Fabien LE LEZ
On Tue, 13 Jun 2006 10:24:58 +0200, Bruno CAUSSE :


MaClass {


"MaClasse", plutôt, ou "MyClass", non ?

.../...


Note que ce symbole indique que le texte continue sur la page
suivante.
Je suppose que tu voulais écrire : [...]
Dans du code C++, je conseille de mettre ce symbole en commentaire,
histoire d'avoir du code (à peu près) compilable :

// [...]

Static int (MaClass::*fonction[100])() ;


Les types "pointeur de fonction" sont généralement très compliqués à
écrire, aussi je conseille d'utiliser un typedef.

Le code ci-dessous fonctionne, fait grosso modo ce que tu veux, mais
n'est pas très propre. AMHA il y a une façon plus élégante de résoudre
ton problème.


#include <iostream>

class C
{
public:
typedef void (*Fonction) (int);

static void f0 (int);
static void f1 (int);

enum { NB_FONCTIONS= 2 };
static Fonction const fct[NB_FONCTIONS];
};

C::Fonction const C::fct[]= { C::f0, C::f1 };

void C::f0 (int x)
{
std::cout << "f0 " << x << "n";
}

void C::f1 (int x)
{
std::cout << "f1 " << x << "n";
}


int main()
{
C::fct[0] (13);
}

Avatar
pasde.hcyrano.spam
Fabien LE LEZ wrote:

Les types "pointeur de fonction" sont généralement très compliqués à
écrire, aussi je conseille d'utiliser un typedef.

Le code ci-dessous fonctionne, fait grosso modo ce que tu veux, mais
n'est pas très propre. AMHA il y a une façon plus élégante de résoudre
ton problème.


merci

ok ca compile, (je n'y serai pas arrivé seul), quel est la façon
elegante?

--
Bruno Causse
http://perso.wanadoo.fr/othello

Avatar
Fabien LE LEZ
On Tue, 13 Jun 2006 23:55:54 +0200, (Bruno
Causse):

quel est la façon
elegante?


Je ne sais pas, puisque je ne connais pas le problème que tu cherches
à résoudre par ton histoire de pointeurs de fonctions.

Avatar
kanze
Bruno CAUSSE wrote:

Comment declarer a l'interieur d'une classe un tableau de
fonction membre static. (je trouve bizarre de trouver des
exemples ou ce tableau est externe a la classe)


Attention : l'adresse d'une fonction membre *statique* n'a pas
un type pointeur à fonction membre, mais un type pointeur à
fonction tout court.

Un truc du genre,

MaClass {

.../...
Static int (MaClass::*fonction[100])() ;


Sans doute « static », et non « Static ». Ici, tu déclares
un tableau de pointeurs à fonction membre. Il faut encore une
définition ailleurs. Et les éléments sont bien des pointeurs à
membre ; tu ne peux donc pas y mettre l'adresse d'une fonction
membre statique.

Pour mettre des adresses des fonctions membre statique, c'est
simplement :
static int (*fonction[100])() ;

Static init_fonction();
.../...

}

De meme pour les appels est il possible de prefixer par la
classe comme les membres static

(MaClass::*fonction[12])();


Non.

Cette ecriture me semble plus logique.


Pas vraiment. Le « MaClass::* » fait partie du type, non du nom
de la variable. Il faut écrire :

(this->*(function[ 12 ]))() ;

On ne peut pas appeler une fonction à travers un pointeur à
fonction membre sans utiliser un objet ou un pointeur à un objet
(ici, this). C'est cet objet ou ce pointeur qui correspond au
« MaClass » (et c'est l'opérateur .* ou ->* qui remplace le *
de la déclaration).

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